java - JPA 标准查询。如何摆脱字符串参数。在 criteria api 中构建不带字符串的查询。输入安全查询

标签 java eclipse jpa types criteria-api

我正在尝试将 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);

Original source: JPA metamodels generator

Hibernate manual

关于java - JPA 标准查询。如何摆脱字符串参数。在 criteria api 中构建不带字符串的查询。输入安全查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31203423/

相关文章:

c++ - 未定义的 impl 引用

android - 如何从 google eclipse 插件 1.7.7 更改为 1.7.5

java - JPA多对多: Adding existing object to another object

java - Spring Security 3.0 Google Apps 使用 OpenID4Java 打开 id 登录

java - 仅获取 1 个随机行的值并将这些值设置为一个类

java - 将 Maps.uniqueIndex 与 Guava 结合使用时拒绝值

java - couchbase 中每个 java POJO 的文档模型是什么

eclipse - jar 在运行时不可用,为什么不呢?

java - Spring Data Rest PagingAndSortingRepository AbstractMethodError (RepositoryFactorySupport)

java - 参数太少的 ObjectDB Select 查询