什么时候应该使用JPA 2.0而不是JPQL或CriteriaBuilder的本机查询?

use*_*956 8 jpql native-sql jpa-2.0

关于何时以及何时不在JPA 2.0中使用本机查询,我感到非常困惑.我的印象是使用本机查询可能会导致我与JPA缓存不同步.如果我可以使用JPQL或CriteriaBuilder查询完成同样的事情,是否有充分的理由使用本机查询?同样,如果我可以使用JPQL或CriteriaBuilder完成同样的事情,那么使用本机查询是否有任何危险?最后,如果使用本机查询存在危险,与JPA缓存不同步,使用JPQL或CriteriaBuilder执行等效查询是否存在同样的危险?

我的理念是避免本地查询,但肯定有时候它们是必要的.在我看来,如果我可以使用JPQL或CriteriaBuilder,那么我应该.

谢谢.

JB *_*zet 12

我同意你的理念.

原生查询的主要问题是IMHO,它的可维护性.首先,它们通常比JPQL查询更复杂,更长.但它们也对表名和列名进行硬编码,而不是使用类和属性名.

重构时JPQL查询已经存在问题,因为它们在字符串中对类和属性名称进行硬编码.但是本机查询更糟糕,因为它们在任何地方对表名和列名进行硬编码.

我不认为本机选择查询是关于缓存的问题.但是,本机更新,插入和删除查询是一个问题,因为它们会修改第一级和第二级缓存后面的数据.所以这些可能会变得陈旧.

另一个问题是您的本机查询可能使用一个数据库识别而不是另一个数据库识别的语法,这使得应用程序更难从一个数据库迁移到另一个数据库.

  • 我还发现这个 API 使用起来非常麻烦且不直观,而且更难阅读。我只在需要根据...标准(因此是 API 的名称)动态编写查询时才使用此 API。例如,当用户提交具有多个可选条件(姓名、名字、最小出生日期、最大出生日期等)的搜索表单时,必须根据这些条件的存在与否添加或不添加各种 where 子句元素。 (2认同)