2 回答

TA貢獻1798條經驗 獲得超3個贊
原來我在這種情況下濫用了@Filter 注釋。
Vlad Mihalcea 幫助我解決了我在 Hibernate 論壇上的帖子的問題
根據他的方向,我設法在沒有過濾器的情況下解決了這個問題,使用沒有獲取的連接查詢和結果轉換器。
該示例的解決方案是:
org.hibernate.query.Query<Client> q = em.createQuery("select cl, cr " +
"from Client cl " +
"join CarRent cr on cr.client = cl and cr.carRentKey.dateDue = :date")
.setParameter("date", exampleDate)
.unwrap(org.hibernate.query.Query.class).setResultTransformer(new BasicTransformerAdapter() {
@Override
public List transformList(List list) {
Map<Serializable, Client> clientMap =
new LinkedHashMap<>(list.size());
for (Object entityArray: list) {
if (Object[].class.isAssignableFrom(entityArray.getClass())) {
Client client = null;
CarRent carRent = null;
Object[] tuples = (Object[]) entityArray;
for (Object tuple : tuples) {
em.detach(tuple);
if (tuple instanceof Client) {
client = (Client) tuple;
}
else if (tuple instanceof CarRent) {
carRent = (CarRent) tuple;
}
else {
throw new UnsupportedOperationException(
"Tuple " + tuple.getClass() + " is not supported!"
);
}
}
if (client != null) {
if (!clientMap.containsKey(client.getId())) {
clientMap.put(client.getId(), client);
client.setRentHistory(new ArrayList<>());;
}
if (carRent != null) {
client.getRentHistory().add(carRent);
}
}
}
}
return new ArrayList<>(clientMap.values());
}
});
List<Client> clientList = q.getResultList();

TA貢獻1943條經驗 獲得超7個贊
我不知道,如果我理解正確,但是這個:
em.createQuery("from Client cl"
+ "left outer join fetch c.rentHistory");
不使用@Embeddable應該過濾的。
編輯:
您需要使用Session已設置的。用它打開事務并查詢結果:
hibernateSession.openTransaction();
results = hibernateSession.createQuery(...).list();
hibernateSession.close();
添加回答
舉報