Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Postgresql EclipseLink是重新排序谓词吗?_Postgresql_Jpa_Eclipselink_Java Ee 7 - Fatal编程技术网

Postgresql EclipseLink是重新排序谓词吗?

Postgresql EclipseLink是重新排序谓词吗?,postgresql,jpa,eclipselink,java-ee-7,Postgresql,Jpa,Eclipselink,Java Ee 7,我有一个JPA查询和以下实体: 产品 颜色 团队 人 团队 人员名单 颜色 人 一个产品可以有一个人或一个团队。不是两者都有。现在,我需要一个查询,可以查找特定人员的所有产品,包括单个人员和团队成员(因此结果列表应该包含这两种情况)。因此,我的查询结构如下: public List<Product> getProductsFor(Person person){ CriteriaBuilder cb = getEntitymanager().getCriteriaBui

我有一个JPA查询和以下实体:

  • 产品
    • 颜色
    • 团队
  • 团队
    • 人员名单
  • 颜色
一个产品可以有一个人或一个团队。不是两者都有。现在,我需要一个查询,可以查找特定人员的所有产品,包括单个人员和团队成员(因此结果列表应该包含这两种情况)。因此,我的查询结构如下:

public List<Product> getProductsFor(Person person){
  CriteriaBuilder cb = getEntitymanager().getCriteriaBuilder();
  CriteriaQuery<Product> query = cb.createQuery(Product.class);
  Root<Product> root = query.from(Root.class);
  Join<Product, Team> teamJoin = root.join(Product_.team, JoinType.LEFT);

  Predicate asSinglePerson = cb.equal(root.get(Product_.person), person);
  Predicate asTeamMember = cb.isMember(persons, teamJoin.get(Team_.members));
  Predicate teamOrSingle = cb.or(asTeamMember, asSinglePerson);
  query.where(teamOrSingle);
  return getEntityManager().createQuery(query).getResultList();
}
省略了一些括号,但查询是相同的。 此查询仅返回该人员是团队成员的产品,而不返回该人员作为单个人员负责的产品

我想要的是这样的东西:

SELECT t1.*
FROM 
  Product t1 LEFT OUTER JOIN team t2 ON (t2.ID = t1.team_ID),
  team_person t3,
  person t4
WHERE
  t1.person_ID = 1 
    OR (t3.person_ID = t4.ID AND t3.team_ID = t2.ID AND t4.ID = 1)
由于OR运算符是我查询中最外层的运算符,为什么它不在结果SQL中

将查询分为两个部分(一个用于团队部分,一个用于单个部分)不是一个选项,因为我们在这一个查询中内置了分页和筛选(这不会影响结果,所以我在清单中省略了它)


感谢您的帮助。

and子句与您的or语句没有任何关系,之所以存在,是因为您用于构建查询的连接语义。关系上的“get”是使用内部联接定义的,是筛选结果所必需的,这些联接可以在From子句中完成,也可以附加到where子句中


您需要在team.members关系上显式使用左外部联接来获取您要查找的查询结果,这与您处理product.team关系的方式类似。

在构造了我所需的确切SQL之后,这也是我得出的结论。我想我是想错了方向。谢谢
SELECT t1.*
FROM 
  Product t1 LEFT OUTER JOIN team t2 ON (t2.ID = t1.team_ID),
  team_person t3,
  person t4
WHERE
  t1.person_ID = 1 
    OR (t3.person_ID = t4.ID AND t3.team_ID = t2.ID AND t4.ID = 1)