SpringJPA的entityManager执行原生SQL

查询到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中间的“-”
	        }
	    }
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值