繁体   English   中英

Hibernate查询示例和预测

[英]Hibernate Query By Example and Projections

简而言之: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<Object> rows = criteria.list();
for(Object r: rows){
  Object[] row = (Object[]) r;
  Type t = ((<Type>) row[0]);
}

如果必须,您可以自己手动填充用户。

如果没有更多信息来诊断问题,很难调查问题。

这里真正的问题是hibernate中存在一个错误,它在where子句中使用select-list别名:

http://opensource.atlassian.com/projects/hibernate/browse/HHH-817

万一有人在这里寻找答案,去看看票。 花了5年时间修复,但理论上它将在下一个版本之一,然后我怀疑你的问题会消失。

ProjectionList pl = Projections.projectionList();
pl.add(Projections.property("id"));
pl.add(Projections.sqlProjection("abs(`pageNo`-" + pageNo + ") as diff", new String[] {"diff"}, types ), diff); ---- solution
crit.addOrder(Order.asc("diff"));
crit.setProjection(pl);

我面临着类似的问题。 我正在使用Query by Example,我想通过自定义字段对结果进行排序。 在SQL中我会做类似的事情:

select pageNo, abs(pageNo - 434) as diff
from relA
where year = 2009
order by diff

没有order-by-clause,它工作正常。 我得到的是

Criteria crit = getSession().createCriteria(Entity.class);
crit.add(exampleObject);
ProjectionList pl = Projections.projectionList();
pl.add( Projections.property("id") );
pl.add(Projections.sqlProjection("abs(`pageNo`-"+pageNo+") as diff", new String[] {"diff"}, types ));
crit.setProjection(pl);

但是当我补充说

crit.addOrder(Order.asc("diff"));

我得到一个org.hibernate.QueryException:无法解析属性:diff异常。 解决方法与也不管用。

PS:因为我找不到任何关于QBE用于Hibernate的详细文档,所有上述内容主要是试错法

我真的不这么认为,我能找到的是“这个”。 导致hibernate不在其查询中包含任何限制,这意味着它获得了所有记录列表。 关于报告的hibernate错误,我可以看到它被报告为已修复但我完全无法下载补丁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM