【问题标题】:JPA eclipselink global batch fetch?JPA eclipselink 全局批量获取?
【发布时间】:2015-03-20 08:08:21
【问题描述】:

加入时,我每行有一个选择。解决方案是批量获取,但我不希望到处都有那个注释......

http://eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_batchfetch.htm

为什么我什至需要这个?每行一个选择是可怕的......我如何在全球范围内设置它?干杯

【问题讨论】:

    标签: jpa eclipselink jpa-2.0


    【解决方案1】:

    也许不是理想的解决方案,但您可以尝试将 JPA 提示与 Java 泛型一起使用:

    public <T> TypedQuery<T> 
    createBatchQuery(String ql, Class<T> clazz, String type, String size, String relation) {
        return em.createQuery(jpql, clazz)
                 .setHint(QueryHints.BATCH_TYPE, type)
                 .setHint(QueryHints.BATCH_SIZE, size)
                 .setHint(QueryHints.BATCH, relation);
    }
    

    然后可以全局使用上述查询,并根据您的需要使用具体的查询实现进行扩展,即

    String jpql = "SELECT c FROM Country c WHERE c.name = :name"; // or @NamedQuery
    TypedQuery<Country> q = createBatchQuery(jpql, Country.class, "JOIN", "64", "c.cities");
    q.setParameter("name", "Australia");
    Country c = q.getSingleResult();
    

    有关此主题的文章:

    【讨论】:

    • 语法并没有真正帮助,因为 c.cities 不是类型安全的,通用 API 会更冗长。此外,如果您使用更高级别的 api 然后 em 进行查询(我使用的是 deltaspike 数据),则无法这样设置
    • c.cities 遵循 JPQL 约定,因此需要在 TypedQuery.setHint 方法和 @QueryHint 注释中指定为字符串。不幸的是,我不知道 DeltaSpike,但您当然可以使用 javax.persistence.EntityManager 进行此类查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多