Tôi muốn tạo truy vấn bằng cách sử dụng JPA CriteriaBuilder và tôi muốn thêm một mệnh đề ORDER BY
. Đây là thực thể của tôi:Có thể đặt hàng bằng khóa tổng hợp với JPA và 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
}
Embedded lớp là:
@Embeddable
public class IdBrand implements Serializable {
@ManyToOne
private Edition edition;
private String name;
}
Và cách tôi đang xây dựng truy vấn của tôi là như thế này:
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();
Và đây là những chức năng được gọi là:
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)));
}
}
Nếu tôi cố gắng đặt sortCol
một cái gì đó giống như "id.name"
tôi nhận được lỗi sau:
javax.ejb.EJBException: java.lang.IllegalArgumentException: Unable to resolve attribute [id.name] against path
Bất kỳ ý tưởng làm thế nào tôi có thể thực hiện điều đó? Tôi đã cố gắng tìm kiếm trực tuyến, nhưng tôi không thể tìm thấy một gợi ý về vấn đề này ... Cũng sẽ rất tuyệt nếu tôi có thể làm tương tự ORDER BY
khi tôi có một mối quan hệ @ManyToOne
(ví dụ, "id.edition.number"
)
Vâng đó là những gì nó nói trong câu trả lời khác mà tôi đã liên kết. Tôi thấy điều này thực sự gây phiền nhiễu và không hiểu tại sao nó không thể hoạt động tự động. Theo hiểu biết của bạn, tôi có gặp vấn đề tương tự nếu tôi sử dụng IdClass thay vì EmbeddedId không? – Kjir
Vâng, nếu chúng ta nhìn vào [Phân cấp loại JPA] (http://www.objectdb.com/java/jpa/persistence/metamodel#Type_Interface_Hierarchy_), chúng ta có thể thấy, EntityType đó mở rộng IdentifiableType, vì vậy có lẽ @Id (@IdClass) là loại có thể nhận dạng, vì vậy bạn có thể làm điều đó. Bạn nên thử nó. Cũng nhận được PersistentType từ thuộc tính, sau đó bạn có thể xác định những gì bạn có thể làm với nó. – JMelnik
Như tôi đang nói, ** có thể ** nó là có thể, vì vậy bạn nên kiểm tra PersistentType, và cung cấp nó ở đây nếu bạn có thể xin vui lòng. – JMelnik