查询到VO
@PersistenceContext
private EntityManager entityManager;
//构造SQL,查询结果加上\"不然查询结果都是大写映射不上实体字段
String sql = "select \"id\",\"name\" from tableName where id = :id"
//构造查询和返回结果到指定VO,返回到map就用Transformers.ALIAS_TO_ENTITY_MAP
NativeQueryImplementor nativeQuery = this.entityManager.createNativeQuery(sql).
unwrap(NativeQueryImpl.class).
setResultTransformer(Transformers.aliasToBean(ViewAlarmCount.class));
//设置参数
nativeQuery.setParameter("id",id);
//设置返回结果类型(不设置有时候会报错)
nativeQuery.addScalar("id", StandardBasicTypes.LONG);
nativeQuery.addScalar("name", StandardBasicTypes.STRING);
//请求结果
List<ViewAlarmCount> resultList = nativeQuery.getResultList();
查询到entity
@PersistenceContext
private EntityManager entityManager;
String sql = "SELECT * " +
"FROM T_LOCAL_SCORE ls " +
"WHERE ls.EXTERNAL_CRITERIA_ID = " + localScore.getExternalCriteriaId() + " " +
"AND ls.assessment_id = " + localScore.getAssessmentId() + " " +
"AND ls.group_Id = " + groupId + " " +
"ORDER BY ls.INSTITUTION_CODE ASC ";
Query nativeQuery = this.entityManager.createNativeQuery(sql,LocalScore.class);
localScoreTemps = nativeQuery.getResultList();
注意
再注入 EntityManage的时候使用了 @PersistenceContext 注解,那可以不可以用@Autowired呢?
具体的分析如下
1.@PersistenceContext是jpa专有的注解,而@Autowired是spring自带的注释
2.EntityManager不是线程安全的,当多个请求进来的时候,spring会创建多个线程,@PersistenceContext就是用来为每个线程创建一个EntityManager的,而@Autowired只创建了一个,为所有线程共用,有可能报错
3.在使用EntityManager的时,请采用@PersistenceContext进行注解,而不要使用@Autowired
@Primary
@Bean(name = “transactionManager”)
public PlatformTransactionManager transactionManager(
@Qualifier(“entityManagerFactory”) EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
自定义主键
public class CustomizePrimaryKey extends UUIDGenerator {
@Override
public Serializable generate(SharedSessionContractImplementor s, Object obj) throws HibernateException {
Serializable id = s.getEntityPersister(null, obj).getClassMetadata().getIdentifier(obj, s);
if (id != null && String.valueOf(id).length() > 0) {//新增时有id,则不自动生成id
return id;
} else {
return String.valueOf(super.generate(s, obj)).replace("-","");//替换掉uuid中间的“-”
}
}
}