Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 带条件的左联接获取失败_Sql_Database_Hibernate_Left Join_Hql - Fatal编程技术网

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的那个。