gpt4 book ai didi

java - JPA Criteria API 不在代码简化和优化中

转载 作者:行者123 更新时间:2023-11-30 07:22:16 25 4
gpt4 key购买 nike

我是 JPA Criteria API 的新手。

2 个问题:

  1. 如何进一步简化这个方法,第三条和第四条语句都需要类参数?
  2. 如何将 NOT IN 操作转换为 NOT EXISTS 以提高性能?

    public List<Pilot> getPilotsExcept(final Integer... entityIds) {

    final CriteriaBuilder critBuilder = em.getCriteriaBuilder();

    final CriteriaQuery<Pilot> critQuery =
    critBuilder.createQuery(getEntityClass());

    final Root<Pilot> root = critQuery.from(getEntityClass()); // Why pass the class again?
    critQuery.select(root).where(
    critBuilder.not(root.get("id").in(Arrays.asList(entityIds))));

    final TypedQuery<Pilot> typedQuery = em.createQuery(critQuery);
    return typedQuery.getResultList();
    }

最佳答案

Why pass the class again?

在 Criteria API 中,查询组件由对象表示。因此 select 子句和 from 子句由对象表示:

  • select 子句表示如下:

    CriteriaQuery<Pilot> critQuery = critBuilder.createQuery(getEntityClass());

    上行中的Pilot类表示查询结果的返回类型。

  • 另一方面,查询的 from 子句定义如下:

    final Root<Pilot> root = critQuery.from(getEntityClass());

在此示例中,RootCriteriaQuery 碰巧具有相同的类型。但并非所有查询都是如此。在某些查询中,您可能希望从查询中返回一个或多个属性(但不是查询中涉及的实体的所有属性)。在这些情况下,您在 CriteriaQuery 中指定的类型将与您在 Root 中使用的类型不同。例如,假设您的 Pilot 实体中有一个 name 属性,并且您只对 Pilot 实体的名称列表感兴趣。在这种情况下,您的 CriteriaQuery 将定义如下:

    CrtieriaQuery<String> cq = cb.createQuery(String.class);

但是在您的示例中,Root 的定义没有改变。

NOT EXISTS expression

为了能够将 not in 表达式转换为 not Exists 形式,您必须使用 ids 制定子查询。以下是 JPA 规范的摘录:

An EXISTS expression is a predicate that is true only if the result of the subquery consists of one ormore values and that is false otherwise. The syntax of an exists expression is

exists_expression::= [NOT] EXISTS (subquery) Of course, this must be translated to the Criteria API, in which case the syntax will be

not(exists(subquery)).

下面是创建子查询的示例(伪代码):

Subquery<Integer> sq = critQuery.subquery(Integer.class);
Root<Pilot> pilot = sq.from(Pilot.class);
sq.select(pilot.<Integer>get("id"));
sq.where(<some_condition>);

关于java - JPA Criteria API 不在代码简化和优化中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37359684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com