在Hibernate Annotation下使用命名查询有什么好处

时间:2009-09-09 14:37:28

标签: java performance hibernate annotations

使用命名查询和我们拥有的查询有什么好处吗?考虑性能,可用性,可维护性等等....

在我们的应用程序中,我们已经定义了我们的查询:

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这似乎是组织所有这些查询的好方法。或者,如果我们有这么多类型的查询,也许是时候重新评估我们的数据库和对象结构了。

2 个答案:

答案 0 :(得分:5)

我在你链接的问题中使用第二种方法(使用字符串常量命名查询)。使用命名查询的主要优点是Hibernate在启动时解析查询,因此可以快速检测到任何错误。

至于你的整体方法,如果你需要很多命名查询,我肯定会质疑你的域模型。对于某些应用程序,这是必要的,但可能会考虑用实体中的延迟加载替换连接。另请参阅使用示例和条件的hobernate查询,因​​为这些也可以以面向对象的方式减少命名查询的使用。

答案 1 :(得分:0)

命名查询可以提高应用程序性能,因为它们只需准备一次,然后它们(以及它们所有相关的支持对象)可以在此后有效地重用,使它们非常适合复杂且经常执行的操作。

有关其他效果调整方法,请参阅here (jpa performance)here (Hibernate performance) on DZone