0

所以我有三个模型.. Crag 有一个或多个 CragLocation,每个 CragLocation 都有一个 Location。我可以使用查询某个 crags 子集

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();
    }

我主要以这种方式查询,因为我的大脑无法处理标准查询。当我看着它们时,我很难解析它们的含义。

那么是否有性能或可维护性(或其他)理由更喜欢标准查询,如果是,您将如何表达此查询?

4

1 回答 1

3

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

条件查询,如果你使用自动生成的元模型,很难写,但一旦写出来,你可以确定没有语法错误。不过,这并不意味着查询完成​​了它应该做的事情。因此,无论如何,您都应该对查询进行单元测试。如果您有涵盖查询的单元测试,则使用您认为最易读和可维护的内容。即使生成底层 SQL 查询存在性能差异,与实际执行查询的成本相比,这种差异也可以忽略不计。

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

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