Dưới đây là một câu trả lời cuối :-) mặc dù tôi không chắc chắn nếu điều đã thay đổi.
Gần đây tôi gặp phải những nhu cầu rất giống nhau, và làm việc xung quanh nó bằng cách sử concat, ví dụ, bằng cách kết hợp các cột thành một cột giả, sau đó countDistinct
trên cột giả.
Nhưng tôi không thể sử dụng criteriaBuilder.concat
vì nó đã tạo JPQL bằng cách sử dụng ||
cho nối, trong đó Hibernate had trouble with.
May mắn thay có @Formula
, do đó, tôi lập bản đồ cột giả đến một lĩnh vực với @Formula
:
@Entity
public class MyEntity {
@Column(name="col_a")
private String colA;
@Column(name="col_b")
private String colB;
@Formula("concat(col_a, col_b)") // <= THE TRICK
private String concated;
}
Bằng cách này tôi cuối cùng đã có thể sử dụng trường concated
cho CriteriaBuilder.countDistinct
:
//...
Expression<?> exp = criteriaBuilder.countDistinct(entity.get("concated"));
criteriaQuery.select(exp);
TypedQuery<Long> query = entityManager.createQuery(criteriaQuery);
return query.getSingleResult();
tôi mong muốn JPA sẽ (hoặc hy vọng đã) hỗ trợ countDistinct
với nhiều cột, sau đó tất cả những mớ hỗn độn này có thể tránh được.
lưu ý : một số dbms không hỗ trợ loại cú pháp này. tôi không biết nếu có. AFAIK Hibernate doe không hỗ trợ điều này – Firo
Thực ra điều đó có vẻ là vấn đề. MySQL có nhưng có lẽ không phải là rất phổ biến –
bạn đã tìm thấy trong khi chờ đợi bất kỳ giải pháp cho câu hỏi của bạn? Tôi có tình huống tương tự và không tìm ra giải pháp cho nó. –