Đây là một thực thể mẫu:JPA nhóm Tiêu chuẩn truy vấn bằng cách sử dụng chỉ id
public class Account{
@Id
Long id
Double remaining;
@ManyToOne
AccountType type
}
public class AccountType{
@Id
Long id;
String name;
}
Bây giờ tôi tạo một truy vấn tiêu chí với gia như follwing:
CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createquery();
Root<Account> accountRoot = criteriaQuery.from(Account.class);
Join<Account, AccountType> typeJoin = accountRoot.join(Account_.type);
criteriaQuery.multiSelect(
typeJoin,
criteriaBuilder.sum(accountRoot.get(Account_.remaining))
);
criteriaQuery.groupBy(typeJoin);
Query query = getEntityManager().createQuery(criteriaQuery);
query.getResultList();
Đoạn mã trên tạo ra lệnh Sql như sau:
select accType.id, accType.name, sum(acc.remaining)
from account acc join accType on acc.accounttype_id = accType.id
group by accType.id
trên công việc mã trong PosgreSQL nhưng không thể chạy trong Oracle, bởi vì trong nó chọn accType.name điều đó không không xuất hiện trong nhóm theo mệnh đề.
cập nhật:
Tôi nghĩ câu hỏi của tôi không rõ ràng cho bạn. Câu hỏi của tôi không phải là về hành vi PostgreSQL hoặc Oracle trong group by
. Câu hỏi của tôi là:
Tôi sử dụng mệnh đề typeJoin
trong mệnh đề group by
(điều này có nghĩa là tôi mong đợi sử dụng ngủ đông tất cả trường AccountType trong group by
), nhưng tại sao hibernate chỉ sử dụng trường nhận dạng trên group by
? nếu tôi sẽ sử dụng chỉ lĩnh vực nhận dạng trong group by
sau đó tôi có thể sử dụng câu lệnh sau:
criteriaQuery.groupBy(typeJoin.get(AccountType_.id)) ;
đây không phải là ý tưởng hay. Trong giải pháp này bất cứ lúc nào AccountType thay đổi tôi hầu hết thay đổi tất cả các truy vấn của tôi. tất nhiên tôi có thể xử lý nó bằng cách phản ánh nhưng tôi nghĩ rằng phải có một giải pháp tốt hơn cho nó. bạn có chắc chắn hibernate cann't bao gồm tất cả các thuộc tính entitiy? –
Bạn chỉ cần chỉ định accountType.id và sử dụng bộ nhớ cache cấp 2 để tải nó sau đó. –
Tất nhiên bạn cũng có thể sử dụng JAM Metamodel để lấy tất cả các thuộc tính của kiểu thực thể và đặt chúng vào nhóm theo đó sẽ là chung chung. –