当前位置: 首页 > 面试题库 >

Criteria API返回的结果集太小

谈灵均
2023-03-14
问题内容

这怎么可能,我必须遵循标准

Criteria criteria = getSession().createCriteria(c);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.add(Restrictions.eq("active",true));
List list = criteria.list();

列表的大小现在为20。如果我将最大结果添加到条件中,

Criteria criteria = getSession().createCriteria(c);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
**criteria.setMaxResults(90);**
criteria.add(Restrictions.eq("active",true));
List list = criteria.list();

..现在列表的大小是18!

我不明白定义最大结果后结果集的大小如何减小,因为行数小于定义的最大数。这肯定看起来像是个错误,还是再次出现了我不知道的一些奇怪的hibernate状态?

如果您正在寻找该问题的答案,请确保阅读已接受的答案及其评论。


问题答案:

通过在Hibernate中打开SQL调试并比较生成的查询,可以很清楚地看到此处发生的情况。

使用一个相当简单的SaleItem一对多映射(希望是不言自明的),这样的Criteria基于-的查询如下:

Criteria c = sessionFactory.getCurrentSession().createCriteria(Sale.class);
c.createAlias("items", "i");
c.add(Restrictions.eq("i.name", "doll"));
c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
c.setMaxResults(2);

产生这样的SQL:

select top ? this_.saleId as saleId1_1_, ... 
from Sale this_ 
inner join Sale_Item items3_ on this_.saleId=items3_.Sale_saleId 
inner join Item items1_ on items3_.items_id=items1_.id 
where items1_.name=?

Query这样的:

Query q = sessionFactory.getCurrentSession().createQuery("select distinct s from Sale s join s.items as i where i.name=:name");
q.setParameter("name", "doll");
q.setMaxResults(2);

产生类似:

select top ? distinct hibernated0_.saleId as saleId1_ 
from Sale hibernated0_ 
inner join Sale_Item items1_ on hibernated0_.saleId=items1_.Sale_saleId 
inner join Item hibernated2_ on items1_.items_id=hibernated2_.id 
where hibernated2_.name=?

请注意第一行中的区别(DISTINCT)。甲ResultTransformerDISTINCT_ROOT_ENTITY是一个Java类,该处理SQL行的结果
之后
html" target="_blank">执行的SQL。因此,当您指定时maxResults,它将被用作SQL的行限制;SQL包含对中元素的联接Collection,因此您将SQL结果限制为90
个子元素
。一旦应用了DISTINCT_ROOT_ENTITY转换器,可能会导致少于20个根元素,这完全取决于在90个连接结果中哪个根元素碰巧排在最前面。


DISTINCTHQL中的行为实际上有很大不同,因为它实际上使用了SQL DISTINCT关键字,该关键字在行限制 之前
应用。因此,它的行为符合您的预期,并解释了两者之间的区别。

从理论上讲,您应该考虑在setProjectionSQL级别上应用投影-
之类的东西c.setProjection(Projections.distinct(Projections.rootEntity()))-但不幸的Projections.rootEntity()是不存在,我只是编造了。也许应该!



 类似资料:
  • 问题内容: 我正在尝试创建一种方法,从中可以查询数据库并检索整个表。 目前,如果我使用这些数据只是正常工作 中 的方法。但是,我希望该方法返回结果。 我正在了解当前代码。 我该如何实现? 问题答案: 您永远不要通过公共方法来回避。这很容易导致资源泄漏,因为您不得不保持语句和连接打开。关闭它们将隐式关闭结果集。但是,将它们保持打开状态将导致它们悬而未决,并且当它们打开过多时,将导致数据库用尽资源。

  • 问题内容: 我正在使用JDBC来实现非常简单的数据库连接。 我已经创建了连接/语句并执行了查询。我在调试器中检查语句的查询对象,以确认它正在发送正确的查询。然后,我再次检查了数据库中的查询(直接从调试器复制),以确保其返回数据。但是,返回的结果集在.next()上给出false 这里有我遗漏的常见陷阱吗? 还有myDB类(一个简单的包装程序,使我可以将连接/语句代码放入任何项目中) 编辑:根据建议

  • 问题内容: 我有一个数据库,正在运行以下查询: 上面的查询一次返回两个结果集,我不能分别触发两个查询。如何在Java类中一次处理两个结果集? 问题答案: 正确的代码来处理JDBC语句返回的多个: 重要位: 并返回以表明语句的结果只是一个数字,而不是一个。 您需要检查以了解是否还有更多结果。 确保关闭结果集或使用

  • 我正在使用JOOQ和Postgres。在博士后中,我有一个专栏性别: (表本身是一个视图,性别列是用Java计算的值的占位符) 在Java中,当I.fetch()视图时,我会对每条记录进行一些计算: 所有看起来都很好,如果打印值,它们都是正确的。但是,当我在我的技能记录上调用intoResultSet()时,性别列在所有值旁边都有一个星号,例如“*男性”。 然后,我使用结果集作为OpenCSV C

  • 问题内容: 我想让PostgreSQL将查询结果作为一个JSON数组返回。给定 我想要类似的东西 要么 (实际上,同时了解两者会更有用)。我尝试过一些类似的事情 而且我觉得我很亲近,但真的不在那儿。我是否应该查看9.15以外的其他文档。JSON函数和运算符? 顺便说一下,我不确定我的想法。这是通常的设计决定吗?我的想法是,我当然可以接受上述3个查询中的第一个查询的结果(例如),并在将其提供给客户端

  • 问题内容: 我需要一个SP来返回多组结果。第二组结果将基于第一组结果的一列。 所以: 如何用我的SP返回@ myTable1和@ myTable2?这种语法完全正确吗? 抱歉,我仍然是SQL的新手… 编辑: 因此,我在下面的代码的最后一行看到错误:“必须声明标量变量“ @ myTable1”” 如果我突出显示并运行代码直到第二个代码,它就可以正常工作。 EDIT2: 解决了该问题。谢谢你们。 问题