Sql 带条件的左联接获取失败
我有以下Sql 带条件的左联接获取失败,sql,database,hibernate,left-join,hql,Sql,Database,Hibernate,Left Join,Hql,我有以下HQL查询: return entityManager().createQuery( "SELECT page FROM ProjectPage page" + " left join fetch page.categorySet as category " + " where page.id = :id " + " and category.parentCategory is null " + " and (category.st
HQL
查询:
return entityManager().createQuery(
"SELECT page FROM ProjectPage page"
+ " left join fetch page.categorySet as category "
+ " where page.id = :id "
+ " and category.parentCategory is null "
+ " and (category.status != :status_val) "
,ProjectPage.class).setParameter("id", id)
.setParameter("status_val", 1).getSingleResult();
问题是where子句中的条件失败,例如,查询返回状态为1的类别对象和parentCategory不为null的类别对象,尽管我如上所述指定了此约束 如果您希望此查询返回
ProjectPage
对象,并且根据where
条件筛选出categorySet
,则您的期望是错误的。如果具有给定id的ProjectPage
实例包含通过where
子句条件的任何类别,它将作为一个整体对象返回。这是出于设计,并且由于底层机制、缓存等原因而需要。如果您需要满足某些条件的类别对象,则必须为此编写单独的查询。您能为我们提供一个SQL FIDLE示例吗?()@Smutje这不是SQL。它是HQL(Hibernate查询语言)。当离开外部联接时,如果WHERE子句中的外部表没有条件,请将它们移到on子句。(如果在WHERE子句中,它不再是一个外部连接,而是一个常规连接。)对不起,请您进一步解释一下“整对象”是什么意思?如果我想在categorySet的每个对象上应用上述条件,我必须做什么?您必须查询类别
对象,而不是项目页面
。类似于从类别c中选择c,其中c.projectPage.id=:id
。我知道的唯一方法就是使用。好的,但我仍然不理解问题的原因,请向我解释“它将作为一个整体对象返回”是什么意思?例如,如果您有一个PageProject
在categorySet
中有两个类别,一个有父类别,另一个没有父类别,并且您有其中category.parentCategory为null
,您将得到整个页面
对象,这意味着它将在其categorySet
中有两个类别,不仅仅是parent=null的那个。