简而言之:hibernate不支持投影和查询示例?我发现这篇文章:
代码是这样的:
User usr = new User(); usr.setCity = 'TEST'; getCurrentSession().createCriteria(User.class) .setProjection( Projections.distinct( Projections.projectionList() .add( Projections.property("name"), "name") .add( Projections.property("city"), "city"))) .add( Example.create(usr))
就像另一张海报所说的那样,生成的sql继续有一个where类引用y0_ =?而不是this_.city.
我已经尝试了几种方法,并搜索了问题跟踪器,但没有发现任何相关信息.
我甚至尝试使用Projection别名和变形金刚,但它不起作用:
User usr = new User(); usr.setCity = 'TEST'; getCurrentSession().createCriteria(User.class) .setProjection( Projections.distinct( Projections.projectionList() .add( Projections.property("name"), "name") .add( Projections.property("city"), "city"))) .add( Example.create(usr)).setResultTransformer(Transformers.aliasToBean(User.class));
有没有人用例子进行投影和查询?
当您具有与objects属性相同的别名时,似乎会发生此问题.Hibernate似乎拿起了别名并在sql中使用它.我在这里和这里发现了这个,我相信它是Hibernate中的一个错误,虽然我不确定Hibernate团队是否同意.
无论哪种方式,我发现一个简单的工作在我的情况下工作.你的旅费可能会改变.详细信息如下,我试图简化此示例的代码,所以我为任何错误或拼写错误道歉:
Criteria criteria = session.createCriteria(MyClass.class) .setProjection(Projections.projectionList() .add(Projections.property("sectionHeader"), "sectionHeader") .add(Projections.property("subSectionHeader"), "subSectionHeader") .add(Projections.property("sectionNumber"), "sectionNumber")) .add(Restrictions.ilike("sectionHeader", sectionHeaderVar)) // <- Problem! .setResultTransformer(Transformers.aliasToBean(MyDTO.class));
会产生这个sql:
select this_.SECTION_HEADER as y1_, this_.SUB_SECTION_HEADER as y2_, this_.SECTION_NUMBER as y3_, from MY_TABLE this_ where ( lower(y1_) like ? )
导致错误的原因是:java.sql.SQLException:ORA-00904:"Y1_":标识符无效
但是,当我改变我的限制使用"this"时,就像这样:
Criteria criteria = session.createCriteria(MyClass.class) .setProjection(Projections.projectionList() .add(Projections.property("sectionHeader"), "sectionHeader") .add(Projections.property("subSectionHeader"), "subSectionHeader") .add(Projections.property("sectionNumber"), "sectionNumber")) .add(Restrictions.ilike("this.sectionHeader", sectionHeaderVar)) // <- Problem Solved! .setResultTransformer(Transformers.aliasToBean(MyDTO.class));
它产生了以下sql,我的问题解决了.
select this_.SECTION_HEADER as y1_, this_.SUB_SECTION_HEADER as y2_, this_.SECTION_NUMBER as y3_, from MY_TABLE this_ where ( lower(this_.SECTION_HEADER) like ? )
而已!解决痛苦问题的一个非常简单的方法.我不知道这个修复程序如何转换为查询示例问题,但它可能会让你更接近.
我可以看到你的用户类吗?这只是使用下面的限制.我不明白为什么限制与实例有任何不同(我认为在示例中默认情况下会忽略空字段).
getCurrentSession().createCriteria(User.class) .setProjection( Projections.distinct( Projections.projectionList() .add( Projections.property("name"), "name") .add( Projections.property("city"), "city"))) .add( Restrictions.eq("city", "TEST"))) .setResultTransformer(Transformers.aliasToBean(User.class)) .list();
我从未使用过alaistToBean,但我只是读过它.你也可以循环结果..
List
如果必须,您可以自己手动填充用户.
如果没有更多信息来诊断问题,很难调查问题.
这里真正的问题是hibernate中存在一个错误,它在where子句中使用select-list别名:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-817
万一有人在这里寻找答案,去看看票.花了5年时间修复,但理论上它将在下一个版本之一,然后我怀疑你的问题会消失.