Criteria Query に重大な問題があります。
私のエンティティクラスは次のようになります:
class X {
...
@Columns(columns = {
@Column(name = "priceCurrency", nullable = false),
@Column(name = "priceAmount", nullable = false)})
@Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentBigMoneyAmountAndCurrency")
@Basic(fetch = FetchType.EAGER)
BigMoney price;
...
}
そして、 を持つ別のクラス Y がありList<X> xs
ます。
また、正常に動作するJPA クエリもあります。
SELECT y
FROM Y y
LEFT JOIN y.xs x
GROUP BY y
ORDER BY SUM(y.price.amount)
これを CriteriaQuery に転送したいと思います。私はから始めました:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Y> q = cb.createQuery(Y.class);
Root<Y> root = q.from(Y.class);
ListJoin<Y, X> j = root.join(Y_.xs, JoinType.LEFT);
q.groupBy(root);
私はいくつかのことを試しましたが、どれもうまくいきませんでした:(ここにいくつかの例があります:
Path<BigDecimal> x = j.get("priceAmount");
また:
Path<BigDecimal> x = j.get("price.amount");
また:
Path<BigDecimal> x = j.get(X_.price).get("amount");
私は何を間違っていますか?
今のところ、ちょっとした回避策に固執しますが、期待どおりに機能します。
class X {
...
@Column(name = "priceCurrency", nullable = false)
@Basic(fetch = FetchType.EAGER)
String priceCurrency;
@Column(name = "priceAmount", nullable = false)
@Basic(fetch = FetchType.EAGER)
String priceAmount;
...
public BigMoney getPrice() {
return BigMoney.of(CurrencyUnit.of(priceCurrency), priceAmount);
}
public void setPrice() {
this.priceCurrency = price.getCurrencyUnit().toString();
this.priceAmount = price.getAmount();
}
}
基準クエリは次のようになります。
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Y> q = cb.createQuery(Y.class);
Root<Y> root = q.from(Y.class);
ListJoin<Y, X> j = root.join(Y_.xs, JoinType.LEFT);
q.groupBy(root);
Path<BigDecimal> a = j.get(X_.priceAmount);
TypedQuery<Y> tq = entityManager.createQuery(q);