在JPA2.0中,我对何时以及何时不使用原生查询感到非常困惑。我的印象是,使用原生查询可能会导致我与JPA缓存脱节。如果我可以用JPQL或CriteriaBuilder查询来完成同样的事情,那么使用原生查询有什么好的理由吗?类似地,如果我可以用JPQL或CriteriaBuilder来完成相同的事情,那么使用原生查询有什么危险吗?最后,如果使用原生查询存在与JPA缓存不同步的危险,那么使用JPQL或CriteriaBuilder执行等价的查询也会存在同样的危险吗?
我的哲学一直是避免原生查询,但肯定有必要这样做。在我看来,如果我可以用JPQL或CriteriaBuilder来做这件事,那么我就应该这么做。
谢谢。
发布于 2012-03-03 23:12:13
我同意你的哲学。
原生查询的主要问题是可维护性。首先,它们通常比JPQL查询更复杂、更长。但它们也硬编码表名和列名,而不是使用类名和属性名。
JPQL查询在重构时已经存在问题,因为它们将类和属性名称硬编码到String中。但是原生查询更糟糕,因为它们到处都是硬编码的表名和列名。
我不认为原生select查询是缓存方面的问题。但是,原生更新、插入和删除查询是一个问题,因为它们在一级和二级缓存后面修改数据。所以这些可能会变得陈旧。
另一个问题是,原生查询可能使用一个数据库可以识别但另一个数据库不能识别的语法,这使得应用程序更难从一个数据库迁移到另一个数据库。
https://stackoverflow.com/questions/9546806
复制相似问题