使用hibernate条件时,仅更改联接类型会影响根域类的子级集合的结果。
例如,让Parent类与Child类具有一对多关系,并具有以下数据:
Parent
| id | Name |
| 1 | Parent 1 |
Child
| id | parent_id | Name |
| 1 | 1 | Child1 |
| 2 | 1 | Child2 |
使用以下hibernate条件返回1父行,访问子集合结果将返回两行:
session.createCriteria(Parent.class)
.createCriteria('child', CriteriaSpecification.INNER_JOIN)
.add( Restrictions.eq( 'name', 'Child1' ) )
.list()
但是,当通过左连接更改上述代码时,将返回1父行,但是在访问子集合时仅返回匹配的子行。
session.createCriteria(Parent.class)
.createCriteria('child', CriteriaSpecification.LEFT_JOIN)
.add( Restrictions.eq( 'name', 'Child1' ) )
.list()
为什么会出现这种副作用?我发现了一些关于使用或避免这种副作用的讨论,具体取决于您的预期结果,但没有任何关于为什么出现这种副作用以及是否达到预期目的的讨论。最直接的问题是一个陈旧的陈旧缺陷(http://opensource.atlassian.com/projects/hibernate/browse/HHH-3872)。
此问题已在此处进行描述,并且似乎已在Hibernate 3.6中修复。
https://hibernate.onjira.com//browse/HHH-2049
问题内容: 我有两个实体:和。我正在使用Hibernate 3.6。 如何使用休眠标准实现这一目标,最重要的是,我必须将其用于分页。 而“我的道”如下所示以显示jqgrid中的“问题”列表 公共列表showHelpDeskIssues(DetachedCriteria dc,int from,int size){ 对于简短的解释,请参考此问题,如何使用struts2-jqgrid插件在jqgrid
问题内容: 我有一个表,我们称它为“ a”,它在涉及许多表的视图中用在左联接中。但是,我只想返回“ a”的行(如果它们也与另一个表“ b”联接)。所以现有的代码看起来像 但它返回的行太多,尤其是其中a在b中不匹配的行。我试过了 这给了我正确的结果,但是不幸的是,“ EXPLAIN PLAN”告诉我们,这样做会导致强制对a和b进行全表扫描,这使事情变得很慢。我的一位同事在b上建议了另一个LEFT J
有可能在QueryDSL中执行以下查询吗? 库存余额存储每个零件号/月/年的库存数据;我只需要当前年份和月份的数据。 我已经得到了基本的左连接: 这就产生了正确的sql,但只是在零件号上连接。 检查生成的零件的库存可用性(除其他外)。左连接是必要的,因为我仍然需要没有库存条目的部件(例如新部件)。Left join将获取没有匹配库存余额的行,但在查询的where子句中添加等将删除没有库存余额的行号
问题内容: 我正在做左外部联接,但是我只能在第一个表上应用限制。ti是否也可以应用于第二个表? 这是我的代码: 这项工作(申请人拥有applicantName属性): 这些都不起作用(产品具有productName属性) criteria.add(Restrictions.eq(“ products.productName”,“ product1”)//产品:属性的名称criteria.add(R
问题内容: 我在Symfony2中使用Doctrine的querybuilder创建查询以获取实体。 我当前的代码如下所示: 现在,我可以使用它来获取所有页面,而不管它们是否已安装。但我只想将其加入页面即可(因此,如果有该应用程序的安装,但在其他页面上,则不会加入该安装)。如果我取消对where子句的引用,它将仅显示已安装该页面的应用程序。我希望该页面具有或没有安装的所有应用程序。 在SQL中,我
问题内容: 我不了解左外部联接,右外部联接的概念,或者根本不理解为什么我们需要使用联接!我正在努力解决的问题以及正在处理的表格在这里:链接 问题3(b) 在SQL中构造命令以解决以下查询,解释了为什么必须使用(外部)联接方法。[5分]“找到每名工作人员及其his属(如果有)的姓名” 问题3(c)- 使用(i)join方法和(ii)子查询方法在SQL中构造命令以解决以下查询。[10分]“查找在计算机