一个人在使用JPA 2.0时,何时应该使用本地查询而不是JPQL或CriteriaBuilder?

10
我非常困惑什么时候应该使用JPA 2.0中的本地查询,什么时候不应该。我以为使用本地查询会导致我与JPA缓存不同步。如果我可以通过JPQL或CriteriaBuilder查询实现相同的功能,是否有任何充分理由使用本地查询?同样,如果我可以通过JPQL或CriteriaBuilder实现相同的事情,使用本地查询是否有任何危险?最后,如果使用本地查询可能使与JPA缓存不同步存在危险,那么使用等效查询的JPQL或CriteriaBuilder是否存在相同的危险?
我的哲学一直是避免使用本地查询,但肯定有必要使用本地查询的时候。对我来说,似乎只要能使用JPQL或CriteriaBuilder实现,就应该使用它们。
谢谢。
1个回答

15

我赞同你的理念。

在我看来,使用本地查询的主要问题是可维护性。首先,它们通常比JPQL查询更复杂且更长。但是,它们也会硬编码表和列名称,而不是使用类和属性名称。

当重构时,JPQL查询已经存在问题,因为它们在字符串中硬编码类和属性名称。但本地查询更糟糕,因为它们在各个地方硬编码表和列名称。

我认为本地选择查询与缓存无关。但是,本地更新、插入和删除查询会导致一级和二级缓存背后的数据被修改,因此可能变得过时。

另一个问题是,您的本地查询可能使用一种语法,在一个数据库中可以识别,但在另一个数据库中可能不行,这使应用程序更难从一个数据库迁移到另一个数据库。


1
像往常一样,@JB Nizet 的解释非常好。问题还涉及到 Criteria Builder。我的理解是,Criteria 查询有助于保持类型安全(正如您在答案中提到的 JPQL 所不具备的)。然而,我个人认为 Criteria API 很笨重且难以阅读。除了 JPQL 之外,Criteria API 还有其他优点吗? - HopeKing
2
我也觉得这个API非常繁琐和不直观,而且很难阅读。我只在需要根据...条件动态组合查询时使用此API(因此该API的名称)。例如,当用户提交带有多个可选条件(姓名、名字、最小出生日期、最大出生日期等)的搜索表单时,必须根据这些条件的存在或缺失添加或不添加各种where子句元素。 - JB Nizet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接