JPA2我应该更喜欢JPQL的标准查询吗?

时间:2012-09-23 11:56:21

标签: jpa-2.0 criteria-api

所以我有三个模型..一个Crag有一个或多个CragLocations,每个CragLocation都有一个Location。我可以使用

查询某个峭壁子集
public List<Crag> getCragsWithGridRef() {
        /**
         * we want to query select c.* from crag c join CragLocation cl on c.id
         * = cl.cragId join Location l on cl.locationId = l.id where
         * len(l.gridReference)>1
         */
        TypedQuery<Crag> query = 
                em.createQuery(
                        "SELECT c FROM Crag c JOIN c.CragLocations cl JOIN cl.location l where LENGTH(l.gridReference) > 1",
                        Crag.class);
        return query.getResultList();
    }

我很大程度上是这样查询的,因为我的大脑无法处理标准查询。当我看着它们时,我很难解析它的含义。

是否存在性能或可维护性(或其他)偏好标准查询的原因,如果是,您将如何表达此查询?

1 个答案:

答案 0 :(得分:3)

不,没有理由比JPQL更喜欢标准查询,特别是如果你认为JPQL查询易于理解和维护,标准查询难以理解和维护(我同意)。

条件查询,如果使用自动生成的元模型,很难编写,但一旦编写,您可以确定没有语法错误。但这并不意味着查询会执行它应该执行的操作。因此,无论如何,您应该对查询进行单元测试。如果您有单元测试覆盖查询,那么使用您认为最易读和可维护的内容。即使生成基础SQL查询存在性能差异,与实际执行查询的成本相比,这种差异也可以忽略不计。

我仅在这两种情况下使用Criteria查询(甚至不总是):

  1. 查询由一组可选搜索条件动态组成
  2. 有许多类似的查询共享一个共同的部分,我想避免在每个查询中重复这个共同的部分。使用标准允许将公共部分放在可重用的方法中。