我正在尝试将 JPA JPQL 查询转移到我的应用程序中的 Criteria 查询。
主要原因是我厌倦了重构字符串和修复许多由类型安全的 JPQL 导致的运行时 jpa 异常。
我在网上搜索了其他支持类型安全和 ide 重构机制的 JPA 解决方案。 Criteria Query 看起来很有希望。
在标准查询中,有一个想法困扰着我:
在方法参数中使用字符串。 它可以以某种方式用类型安全的 java 对象/变量(也许是 java 反射)替换吗?
下面是示例代码:
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.<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();
}
如您所见,有字符串:
- “余额”
- “所有者名称”
如果我更改此参数的名称,则在 IDE 或编译时不会出现错误。我必须在运行时测试它,这对于像我这样的大型项目来说并不好。
我使用:
- JPA 与 hibernate
- jdbc
- 播放框架
请帮忙。
最佳答案
元模型生成器似乎也是一个很好的解决方案:
示例实体:
@Entity
public class Order {
@Id
@GeneratedValue
Integer id;
@ManyToOne
Customer customer;
@OneToMany
Set<Item> items;
BigDecimal totalCost;
// standard setter/getter methods
}
生成元模型(在编码/编写 Order 类时由 eclipse IDE 自动生成。原始类中的每个更改:Order
- 即使不保存文件也会在 Order_
类中自动更新):
@StaticMetamodel(Order.class)
public class Order_ {
public static volatile SingularAttribute<Order, Integer> id;
public static volatile SingularAttribute<Order, Customer> customer;
public static volatile SetAttribute<Order, Item> items;
public static volatile SingularAttribute<Order, BigDecimal> totalCost;
}
因此,我们可以构建类型安全的 SQL 查询,如下所示:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
SetJoin<Order, Item> itemNode = cq.from(Order.class).join(Order_.items);
cq.where( cb.equal(itemNode.get(Item_.id), 5 ) ).distinct(true);
关于java - JPA 标准查询。如何摆脱字符串参数。在 criteria api 中构建不带字符串的查询。输入安全查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31203423/