【问题标题】:Order by in JPA Specification按 JPA 规范排序
【发布时间】:2021-04-06 16:03:43
【问题描述】:

我正在使用 Spring JPA 规范进行查询,但无法实现与订购相关的用例。请注意,由于某种原因,我被规范卡住了,无法切换到 JPQL。

这是修剪后的域模型:

@Entity
public class Employee {
  @Id
  @GeneratedValue
  private long id;

  private String name;

  @OneToMany(mappedBy = "employee", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  private List<Phone> phones; //contains both "active" & "inactive" phones
}


@Entity
public class Phone {
  @Id
  @GeneratedValue
  private long id;

  private boolean active;
  private String number;
  
  @ManyToOne(fetch = FetchType.LAZY)
  private Employee employee;
}

我需要根据他们拥有的活动电话数量来拉动所有员工并订购他们。我已经使用了代码-

List<Order> orders = new ArrayList<>();
orders.add(cb.desc(cb.size(employee.get("phones"))));
cq.orderBy(orders);

当我运行代码时,被执行的查询有

ORDER BY (SELECT 
        COUNT(phone4_.employee_id)
    FROM
        phone phone4_
    WHERE
        employee4_.id = phone4_.employee_id) DESC
        
    
    

我尝试了很多方法,但无法向仅检查 “活动” 电话的 WHERE 逻辑添加另一个条件。请提出建议。

更新:

我做了一些研究并尝试了以下方法来实现用例。但是,我收到错误 - “org.hibernate.hql.internal.ast.QuerySyntaxException:意外的 AST 节点:查询”

Subquery<Long> subquery = cq.subquery(Long.class);
Root<Phone> phRoot= subquery.from(Phone.class);
Predicate p1 = cb.equal(root.get("id"), phRoot.get("employee").get("id"));
Predicate p2 = cb.isTrue(phRoot.get("active"));

cq.distinct(true);
List<Order> orders = new ArrayList<>();
orders.add(cb.desc(subquery.select(cb.count(phRoot.get(ID))).where(p1, p2)));

【问题讨论】:

    标签: java spring spring-boot jpa spring-data-jpa


    【解决方案1】:

    为了使 CriteriaBuilder 对集合的大小进行排序,您需要通过添加 &lt;Collection&gt; 来指定该属性是一个集合。

    对于你的代码,这将是

    orders.add(cb.desc(cb.size(employee.<Collection<Phone>>get("phones"))));
    

    请参阅https://stackoverflow.com/a/21027934/924036 以获得更详尽的说明。

    【讨论】:

    • 代码将根据电话的数量(包括活跃和不活跃)对员工进行排序...我需要根据活跃电话的数量对员工进行排序。
    • @Tapan 很抱歉没有发现您想在活动手机上进行排序。
    • 没问题 :) 我已经为这个用例苦苦挣扎了一个星期......让我想知道 JPA 规范是否支持这个
    猜你喜欢
    • 2021-07-02
    • 2020-06-17
    • 1970-01-01
    • 2018-07-22
    • 2017-08-19
    • 2020-10-10
    • 2020-01-11
    • 2019-04-29
    • 1970-01-01
    相关资源
    最近更新 更多