ORDER BY
JPA CriteriaBuilderを使用してクエリを作成し、句を追加したいと思います。これは私の実体です:
@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:パスに対して属性[id.name]を解決できません
どうすればそれを達成できるでしょうか?ORDER BY
オンラインで検索してみましたが、ヒントが見つかりませんでした...関係があるときに同様のことができれば素晴らしいと思い@ManyToOne
ます(たとえば"id.edition.number"
)