Jpa Joda Money中的BigMoney条件查询(实体中的多列字段)

Jpa Joda Money中的BigMoney条件查询(实体中的多列字段),jpa,criteria,criteria-api,criteriaquery,Jpa,Criteria,Criteria Api,Criteriaquery,我对条件查询有一个严重的问题 我的实体类如下所示: class X { ... @Columns(columns = { @Column(name = "priceCurrency", nullable = false), @Column(name = "priceAmount", nullable = false)}) @Type(type = "org.jadira.usertype.moneyandcurrency.joda.Persistent

我对条件查询有一个严重的问题

我的实体类如下所示:

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,它有一个
列表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);
现在,条件查询如下所示:

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);
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery q=cb.createQuery(Y.class);
根根=q.from(Y.class);
ListJoin j=root.join(Y_ux.xs,JoinType.LEFT);
q、 groupBy(root);
路径a=j.get(X_u.priceAmount);
TypedQuery tq=entityManager.createQuery(q);

看起来您想将JPA的CriteriaBuilder API与Hibernate专有注释一起使用
@Columns
是的,也许这就是问题所在。我已经发布了一些解决方法(可能是唯一可能的)
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);