2017-07-06 43 views
0

迁移到JPA在我们的遗留Hibernate相关的代码,我转换为JPA后使用变压器的能力,我们曾与变压器一个直接基于SQL的查询。忘记从休眠

// 1. Create Hibernate Query object 
org.hibernate.Query query = sessionFactory.getCurrentSession().createQuery(sql.toString()); 

// 2. Run a transformer 
query.setResultTransformer(Transformers.aliasToBean(User.class)); 

// 3. Obtain Result List 
List results = query.list(); 

但现在,我已经转换这JPA(这仍然是使用直接SQL),我不能再使用Transformer一步,因为JPA语法不支持它。

如果我省略了变压器一步,我得到一个大小写错误如下关于我的领域之一,

org.hibernate.QueryException: could not resolve property: ID of: USER_T 
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:62) 
at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:56) 
at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1859) 

因为我UserT对象有命名为id(小写)领域。我的猜测是Transformer在这里是必需的,但是我不能在新的JPA语法中使用它。

回答

0

尝试:

org.hibernate.Query query = sessionFactory.getCurrentSession().createQuery(sql.toString()); 
query.createAlias("id", "ID") 
query.setResultTransformer(Transformers.aliasToBean(User.class)); 

从AliasToBeanResultTransformer源例如:

* List resultWithAliasedBean = s.createCriteria(Enrolment.class) 
*   .createAlias("student", "st") 
*   .createAlias("course", "co") 
*   .setProjection(Projections.projectionList() 
*     .add(Projections.property("co.description"), "courseDescription") 
*   ) 
*   .setResultTransformer(new AliasToBeanResultTransformer(StudentDTO.class)) 
*   .list(); 

也可以延长AliasToBeanResultTransformer和超越控制方法transformTuple()。并申请overided变压器setResultTransformer()