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

boy*_*715 4 java performance annotations hibernate

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

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

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;
Run Code Online (Sandbox Code Playgroud)

(这些都放在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; 
Run Code Online (Sandbox Code Playgroud)

这不过是:

public List findByNamedParams(final String arg0, 
                              final Map<String, 
                              ? extends Object> arg1) throws DataAccessException 
{
  return org.springframework.orm.jpa.JpaTemplate.findByNamedParams(arg0, arg1);
}
Run Code Online (Sandbox Code Playgroud)

与使用相比

@NamedQuery(name="SELECT_CODE_FOR_STORE", query="select ......")
Run Code Online (Sandbox Code Playgroud)

我们的DAO对象的顶部.

我看到这个帖子似乎是组织所有这些查询的好方法.或者,如果我们有这么多类型的查询,也许是时候重新评估我们的数据库和对象结构了.

Pab*_*jim 5

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

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