【问题标题】:Apply Order By in JPA Specifications在 JPA 规范中应用 Order By
【发布时间】:2020-04-29 09:28:00
【问题描述】:

我正在使用 JPA 规范编写代码:

片段1:

Specification.where(withTopics())
        .and(withCar())
        .and(withInsurance())
        // how to add order by

每个条件方法的结构如下:

public static Specification<Page> withCar(String type) {
    return new Specification<Page>() {
      @Override
      public Predicate toPredicate(Root<Page> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        return // logic return cb
      }
    };
}

我想按条件添加订单。

我已经用表达式写了顺序:

public static Specification<Page> orderByConditions(String input1, String input2) {
    return new Specification<Page>() {
      @Override
      public Predicate toPredicate(Root<Page> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        Expression<Object> cases = cb.selectCase()
                .when(cb.equal(cb.lower(root.get("carn_ame")), inputTopic.toLowerCase()), 1)
                .when(cb.like(cb.lower(root.get("insurance_name")), "%" + inputTitle.toLowerCase() + "%"), 2)
                .otherwise(3);
        Order order = cb.desc(cases);
        cb.createQuery().orderBy(order);
        // what to return
      }
    }
}

我应该从我的orderByConditions() 返回什么,以便我可以将其应用于我在 Snippet1 中的规范?

但是我应该如何将它添加到我的规范中呢?

【问题讨论】:

标签: java oracle jpa


【解决方案1】:

如果您没有条件/谓词,则可以返回“无条件”1 = 1

return cb.equal(cb.literal(1), 1);

【讨论】:

  • 看起来有点老套。
  • 通常使用规范来创建谓词,而不仅仅是 order by 子句。但是这种无条件是很常见的。所以无论如何数据库都会删除它。
  • 谢谢。我最终使用了命名查询,但这种见解将来真的会对我有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 2016-10-31
  • 2019-01-27
相关资源
最近更新 更多