所以我有三个模型..一个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();
}
我很大程度上是这样查询的,因为我的大脑无法处理标准查询。当我看着它们时,我很难解析它的含义。
是否存在性能或可维护性(或其他)偏好标准查询的原因,如果是,您将如何表达此查询?
答案 0 :(得分:3)
不,没有理由比JPQL更喜欢标准查询,特别是如果你认为JPQL查询易于理解和维护,标准查询难以理解和维护(我同意)。
条件查询,如果使用自动生成的元模型,很难编写,但一旦编写,您可以确定没有语法错误。但这并不意味着查询会执行它应该执行的操作。因此,无论如何,您应该对查询进行单元测试。如果您有单元测试覆盖查询,那么使用您认为最易读和可维护的内容。即使生成基础SQL查询存在性能差异,与实际执行查询的成本相比,这种差异也可以忽略不计。
我仅在这两种情况下使用Criteria查询(甚至不总是):