【发布时间】:2018-07-22 08:56:41
【问题描述】:
我有一个排序问题,本机 SQL 和可能 JPQL 很容易解决这个问题,但 Spring JPA 规范却没有。
这是修剪后的域模型:
@Entity
class DesignElement {
List<Change> changes;
}
@Entity
class Change {
List<DesignElement> designElements;
}
@Entity
class Vote {
Change change;
VoteType type;
}
用户在几个元素上发布他们的Change 提案,其他用户使用VoteType 或GREAT、GOOD、NEUTRAL 或BAD 对这些更改进行投票。
我试图完成的是通过GOOD 和GREAT 的票数来订购Entitys(而不是Changes)。
使用 SQL 或 JPQL 可能更容易,但我们尝试使用 Specification API,因为我们需要其他几个谓词和顺序。
经过两天的痛苦,我想出了几个关于我不能用 Specification api 做什么的假设。其中一些可能是错误的,如果是这样,我将用答案编辑问题。
- 如果我们有多个
Specification<DesignElement>s 要组合,我们不能只在根查询中添加count(Vote_.id)。 - 在 JPA 中无法通过子查询进行排序:https://hibernate.atlassian.net/browse/HHH-256
- 不能在子查询中使用
multiselect。
这是在其他Specification<DesignElement>s 中定义的其他几个工作Orders:
private static void appendOrder(CriteriaQuery<?> query, Order order) {
List<Order> orders = new ArrayList<>(query.getOrderList());
orders.add(0, order);
query.orderBy(orders);
}
public static Specification<DesignElement> orderByOpen() {
return new Specification<DesignElement>() {
@Override
public Predicate toPredicate(Root<DesignElement> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
appendOrder(query, cb.desc(root.get("status").get("open")));
return null;
}
};
}
public static Specification<DesignElement> orderByReverseSeverityRank() {
return new Specification<DesignElement>() {
@Override
public Predicate toPredicate(Root<DesignElement> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
appendOrder(query, cb.desc(root.get("severity").get("rank")));
return null;
}
};
}
public static Specification<DesignElement> orderByCreationTime() {
return new Specification<DesignElement>() {
@Override
public Predicate toPredicate(Root<DesignElement> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
appendOrder(query, cb.asc(root.get("creationTime"));
return null;
}
};
}
这将允许这样的用法:
List<DesignElement> elements = designElementDao.findAll(Specifications.where(orderByReverseSeverityRank()).and(orderByCreationTime());
【问题讨论】:
-
我正在尝试使用 Spring JPA 规范 API:docs.spring.io/spring-data/jpa/docs/current/api/org/…
标签: java spring jpa specifications