当前位置: 首页 > 知识库问答 >
问题:

JPA条件API和多个子查询的问题

寿毅庵
2023-03-14

我正在努力使用JPA标准API来为我的数据结构制定一个查询。好的,我的实体如下。我有用户和组(两者共享一个公共的基类OrgEntity)。从逻辑上讲,用户当然可以是多个组中的成员。最后,我有一个表示任务的实体,它有一个潜在所有者的列表(可以是单个用户,也可以是整个组)。域模型总结在下面,是给出的,所以我不能改变它。

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
abstract public class OrgEntity {
   @Id
   public String name;
   ...
}

@Entity
public class User extends OrgEntity {
   public String displayName;

   @ManyToMany(mappedBy="members")
   public List<Group> groups;   
   ...
}

@Entity
public class Group extends OrgEntity {
   @ManyToMany
   public List<User> members;
   ...
}

@Entity
public class Task {
   @Id
   public String uuid;

   @ManyToMany
   public List<OrgEntity> potentialOwners;

   ...
}

查询的起点是User的单个实例。我想知道用户是潜在所有者的所有任务(无论用户是直接包含在potentialOwners集合中还是包含在potentialOwners中的组的成员)。

SELECT DISTINCT t FROM Task AS t JOIN t.potentialOwners po 
WHERE (po IN (SELECT g FROM User u JOIN u.groups g WHERE u = :user) 
       OR po IN (SELECT u FROM User u WHERE u = :user))

谢谢

共有1个答案

司马宏茂
2023-03-14

好了,我终于想出了怎么做。如果你对我的解决方案感兴趣,就在这里。u是用户对象,基本上是查询参数,em是EntityManager实例。

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();

// specifies the result value of the query
CriteriaQuery<Task> cq = criteriaBuilder.createQuery(Task.class);        
// start with the navigation at the task entity
Root<Task> from = cq.from(Task.class);
// join the potential owner organizational entities
Join<Task,OrgEntity> potentialOwners = from.join("potentialOwners");        
// select the tasks but remove duplicates
CriteriaQuery<Task> select = cq.select(from).distinct(true);

// definition for subquery1: fetch the user instance
Subquery<User> subquery1 = cq.subquery(User.class);
// start at the User entities
Root<User> from1 = subquery1.from(User.class);
// select the whole user
subquery1.select(from1);
// based on the specified user
subquery1.where(criteriaBuilder.equal(from1, u)); 

// definition for subquery2: fetch all groups for given user
Subquery<Group> subquery2 = cq.subquery(Group.class);
// we start at the User entity
Root<User> from2 = subquery2.from(User.class);
// join to Group entities via the groups collection
Join<User, Group> groups = from2.join("groups");
// select the group entities only
subquery2.select(groups).distinct(true);
// and finally restrict to all groups of the specified user
subquery2.where(criteriaBuilder.equal(from2, u));

// order in descending order based on the unique task id
select.orderBy(criteriaBuilder.desc(from.get("uuid")));

// here we restrict to those tasks that have the potential
// owners either in the result set of subquery2 or subquery1
// additionally I've tried to filter for another restriction
// in the task (based on a like statement of the uuid)
select.where(criteriaBuilder.and(
        criteriaBuilder.or(
            criteriaBuilder.in(potentialOwners).value(subquery2), 
            criteriaBuilder.in(potentialOwners).value(subquery1)),
        criteriaBuilder.like(from.<String>get("uuid"), "1%")));


TypedQuery<Task> typedQuery = em.createQuery(select);
List<Task> resultList = typedQuery.getResultList();
 类似资料:
  • 显然,扩展了,是抽象的,继承是, 和 具有 其他原因 。 但生成的SQL是这样的: 在我期待的时候: 请注意 使用另一根- 使用子查询- 将lastName字段上移到主题 使用本机查询 使用实体图 是不能接受的。 我感兴趣的是可以在WHERE子句中直接声明和使用的东西(仅从CriteriaBuilder和/或单个Root生成,就像子句一样)(如果确实存在的话)。

  • 如何创建高效的 JPA 条件查询,以便仅当实体存在于联接表中时才选择实体列表?例如,采用以下三个表: 有问题的查询(我希望 JPA 生成什么)是: 以下条件查询将产生类似的结果,但有两个连接: 根本问题似乎是我对USER_WORKGROUP连接表使用@JoinTable注释,而不是对连接表使用单独的@Entity,所以我似乎不能在条件查询中将USER_WORGGroup用作根。 以下是实体类:

  • 现在我扪心自问,是不是有什么“点符号”或者其他什么东西让这个案例变得可有可无。在E。例如:本机SQL我会做一些事情,比如创建一个子查询,并从内部投影中选择所有别名值()。 如果有任何建议,我将不胜感激。

  • 我在Eclipselink2.3.2中使用JPA2.0,在其中,我在产品和它们的颜色之间建立了多对多的关系。一个产品可以有多种颜色,一种颜色可以与多种产品相关联。这种关系在数据库中由三个表表示。 null 很明显,实体类有一组颜色-,它被命名为。 实体类有一组产品-,它被命名为。 我需要根据提供的与表中的颜色不匹配的从表中获取颜色列表。 对应的JPQL如下所示。 它生成以下SQL语句。 因为这将是

  • 问题内容: 在我当前的项目中,我遇到了使用hibernate条件查询获取实体的问题。我有以下实体: 教授,其中包含学生名单 学生,其中包含作业列表。 作业,其中包含分配到的学生的ID。 现在,我想获得与教授有关的所有作业,即教授分配给他的学生的所有作业。 此查询显示我要在条件查询中实现的内容。 如何使用hibernate条件API实施此查询? 问题答案: 假设您的表格是这样的: 使用别名的简单示例

  • 我有一个关于jpa中的子查询类的问题。我需要创建两个自定义字段的子查询,但是子查询没有多选方法,选择方法有表达式输入参数(在查询中这是选择)和配置方法不合适。 此外,我对联接子查询结果有疑问,是否可能?怎么做呢? 我有: 链延伸度 消息实体 查询包装 我需要创建这个查询(这是查询的一部分,我从谓词中获得的另一部分。JPQL不合适) 在子查询中我做 但是,子查询在params中没有带有Compoun