【发布时间】:2012-04-27 00:39:00
【问题描述】:
我想使用 JPA CriteriaBuilder 创建一个查询,并且我想添加一个ORDER BY 子句。这是我的实体:
@Entity
@Table(name = "brands")
public class Brand implements Serializable {
public enum OwnModeType {
OWNER, LICENCED
}
@EmbeddedId
private IdBrand id;
private String code;
//bunch of other properties
}
嵌入式类是:
@Embeddable
public class IdBrand implements Serializable {
@ManyToOne
private Edition edition;
private String name;
}
我构建查询的方式是这样的:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Brand> q = cb.createQuery(Brand.class).distinct(true);
Root<Brand> root = q.from(Brand.class);
if (f != null) {
f.addCriteria(cb, q, root);
f.addOrder(cb, q, root, sortCol, ascending);
}
return em.createQuery(q).getResultList();
下面是调用的函数:
public void addCriteria(CriteriaBuilder cb, CriteriaQuery<?> q, Root<Brand> r) {
}
public void addOrder(CriteriaBuilder cb, CriteriaQuery<?> q, Root<Brand> r, String sortCol, boolean ascending) {
if (ascending) {
q.orderBy(cb.asc(r.get(sortCol)));
} else {
q.orderBy(cb.desc(r.get(sortCol)));
}
}
如果我尝试将 sortCol 设置为 "id.name" 之类的值,则会收到以下错误:
javax.ejb.EJBException: java.lang.IllegalArgumentException: Unable to resolve attribute [id.name] against path
知道我该如何做到这一点吗?我尝试在线搜索,但找不到关于此的提示...如果我有 @ManyToOne 关系(例如,"id.edition.number")时可以做类似的 ORDER BY 也很棒
【问题讨论】:
标签: java jpa criteria-api