从Hibernate迁移到JPA后失去了使用变形金刚的能力

时间:2017-07-06 18:47:05

标签: hibernate jpa

在我传统的依赖Hibernate的代码中,我正在转换为JPA,我们有一个带有变换器的基于Direct 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(仍在使用Direct SQL),我不能再使用Transformer步骤了,因为JPA语法不支持它。

如果我省略了Transformer步骤,我会得到一个区分大小写的错误,如下所示:

 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语法一起使用。

1 个答案:

答案 0 :(得分: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和overide方法transformTuple()。并为setResultTransformer()

应用重叠变换器