【问题标题】:What are the advantages of using named queries under Hibernate AnnotationHibernate Annotation下使用命名查询有什么好处
【发布时间】:2010-11-26 20:57:56
【问题描述】:

与我们现有的相比,使用命名查询有什么优势吗?查看性能、可用​​性、可维护性等......

在我们的应用程序中,我们这样定义查询:

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

【问题讨论】:

标签: java performance hibernate annotations


【解决方案1】:

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

有关其他性能调优方法,请参阅here (jpa performance)here (Hibernate performance) on DZone

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • +1 表示“面向对象的方式”。 IMVHO,构建查询的任务可以委托给查询构建器的层次结构。
    猜你喜欢
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多