我正在尝试将此JPA QL转换为条件构建器。JBoss 6.0。
"SELECT ba FROM BankAccount ba WHERE ba.balance >= :amt ORDER BY ba.ownerName ASC"
我根据一些教程编写了此代码。
public List<BankAccount> findWithBalance(int amount) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<BankAccount> cq = cb.createQuery(BankAccount.class); Root<BankAccount> from = cq.from(BankAccount.class); ParameterExpression<Integer> balance = cb.parameter(Integer.class); cq.select(from); Predicate predicate = cb.gt(from.get("balance"), balance); cq.where(predicate); cq.orderBy(cb.asc(from.get("ownerName"))); TypedQuery<BankAccount> query = em.createQuery(cq); return query.getResultList(); }
但是,我在一行中遇到了一个编译错误:
Predicate predicate = cb.gt(from.get("balance"), balance);
错误是:
The method gt(Expression<? extends Number>, Expression<? extends Number>) in the type CriteriaBuilder is not applicable for the arguments (Path<Object>, ParameterExpression<Integer>)
好吧,我终于找到了调用gt()方法的正确方法。这是完整的解决方案。在JBoss 6中经过全面测试。
public List<BankAccount> findWithBalance(int amount) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<BankAccount> cq = cb.createQuery(BankAccount.class); Root<BankAccount> from = cq.from(BankAccount.class); ParameterExpression<Integer> balance = cb.parameter(Integer.class); cq.select(from); //Here is the trick! Predicate predicate = cb.gt(from.<Integer> get("balance"), balance); cq.where(predicate); cq.orderBy(cb.asc(from.get("ownerName"))); TypedQuery<BankAccount> query = em.createQuery(cq); query.setParameter(balance, amount); return query.getResultList(); }