使用命名查询和我们拥有的查询有什么好处吗?考虑性能,可用性,可维护性等等....
在我们的应用程序中,我们已经定义了我们的查询:
private static final String SELECT_CODE_FOR_STORE = "select DISTINCT code from Code code "
+ "join code.codeDescriptions codeDesc "
+ "join codeDesc.stores store where store.id =:"
+ DataAccessConstants.PARAM_STORE_ID;
(这些都放在DAO对象中,其中有很多。)
我们使用以下方式调用上述内容:
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("storeId", codeDescriptionSearchCriteria.getStoreId());
List<Code> list = getJpaTemplate().findByNamedParams(
SELECT_CODE_FOR_STORE, paramMap);
return list;
仅此而已:
public List findByNamedParams(final String arg0,
final Map<String,
? extends Object> arg1) throws DataAccessException
{
return org.springframework.orm.jpa.JpaTemplate.findByNamedParams(arg0, arg1);
}
与使用
相比@NamedQuery(name="SELECT_CODE_FOR_STORE", query="select ......")
我们的DAO对象的顶部。
我看到this posting这似乎是组织所有这些查询的好方法。或者,如果我们有这么多类型的查询,也许是时候重新评估我们的数据库和对象结构了。
答案 0 :(得分:5)
我在你链接的问题中使用第二种方法(使用字符串常量命名查询)。使用命名查询的主要优点是Hibernate在启动时解析查询,因此可以快速检测到任何错误。
至于你的整体方法,如果你需要很多命名查询,我肯定会质疑你的域模型。对于某些应用程序,这是必要的,但可能会考虑用实体中的延迟加载替换连接。另请参阅使用示例和条件的hobernate查询,因为这些也可以以面向对象的方式减少命名查询的使用。
答案 1 :(得分:0)
命名查询可以提高应用程序性能,因为它们只需准备一次,然后它们(以及它们所有相关的支持对象)可以在此后有效地重用,使它们非常适合复杂且经常执行的操作。
有关其他效果调整方法,请参阅here (jpa performance)和here (Hibernate performance) on DZone。