有哪些利弊的使用 标准非常?标准API是一个很好的面向对象的方式快速查询在休眠,但有时标准查询更加难以理解的建立比非常.

当你使用的标准和时非常?你喜欢什么,在其使用的情况下?或是它只是一个问题的味道?

有帮助吗?

解决方案

我大多喜欢动态查询标准的查询。例如,它是很容易动态地添加某种排序或留下一些部分(例如限制)了根据一些参数。

在我使用的HQL静态和复杂查询另一方面,因为它更容易理解/阅读HQL。此外,HQL是一个比较强大的,我想,如用于不同连接类型。

其他提示

有一个方面的差异之间的性能非常及criteriaQuery,你每次的火查询使用criteriaQuery,它创建了一个新的别名表的名字并没有反映在最后询问缓存的任何数据库。这导致开销的编制产生的SQL,把更多的时间来执行。

关于取的战略 [http://www.hibernate.org/315.html]

  • 标准方面的懒惰的设置,在你的映射,并保证你想要什么装载。这意味着一个标准的查询可能会导致在几个SQL立即选择的发言,以获取的子图与所有非懒映协会和集合。如果你想改变的"如何"甚至"是什么",使用setFetchMode()启用或禁用外加入获取用于一个特定的集合或协会。标准的查询,也完全尊重取的战略(加入vs选择vs子选择的).
  • 非常尊重懒惰的设置,在你的映射,并保证你想要什么装载。这意味着一个非常查询的结果可能在几个SQL立即选择的发言,以获取的子图与所有非懒映协会和集合。如果你想改变的"如何"甚至"是什么",使用的左边加入获取启用外加入获取用于一个特定的集合或可空的很多对一个或一对一关联,或加入取使内部加入提取用于非空多对一个或一对一关联。非常的查询不尊重任何取="加入"定义的映射的文件。

标准是一个面向对象的API,同时非常装置串连接。这意味着所有的利益的对象的取向适用:

  1. 所有人是平等的,OO的版本是有点不太容易出错。任何旧的串可以得到所附成的非常的查询,而只有有效的标准的对象可以使它成为一个标准的树。有效的标准类更多的约束。
  2. 与自动完成的,OO是更容易被发现(并因此更容易使用,至少对我来说).你不一定需要记住的哪些部分的查询去;IDE可以帮助你
  3. 你也不需要记住的事项的法(如其符号的地方去).所有你需要知道的是如何称呼方法和创建的对象。

由于非常非常喜欢SQL(其中大多数开发非常清楚地知道已经)然后,这些"不记得"论据不携带多的重量。如果是非常多的不同,那么这将是更多的importatnt.

我通常使用标准的时候,不知道是什么的输入将在数据的其片段中。就像一个搜索表单,用户可以输入任何1至50项,并在我不知道他们会被搜索。这是很容易,只是追加更多的标准,因为我去通过检查用户正在寻找。我认为这将是一个多一点麻烦把一个HQL查询在那种情况下。 HQL是巨大的,虽然当我知道我想要什么。

HQL是更容易阅读,更容易使用像Eclipse的Hibernate插件工具来调试,也更容易登录。条件查询是建立地方很多行为是在运行时确定的动态查询更好。如果你不知道SQL,我可以了解使用条件查询,但总体来说,我更喜欢HQL,如果我知道我想要的前期。

标准是唯一的方式指定的自然键查询,利用特殊的优化在第二级别的查询高速缓冲存储器。非常不具有任何方式指定的必要暗示。

你可以找到一些更多的信息:

标准Api是一个很好的概念的休眠状态。根据我的观点,这些都是几点,我们可以出差 非常标准Api

  1. 非常的是执行两个选择的和非选择的操作上的数据,但条件是只为选择数据,我们无法执行的非选择的操作使用的标准。
  2. 非常适合用于执行静态查询,其中作为标准是适合的执行动态查询
  3. 非常不支持 页码 概念,但我们可以实现分页的标准。
  4. 标准用于需要更多的时间来执行比非常.
  5. 与标准,我们是安全的 SQL注射 因为它的动态查询一代,但在非常为你的查询,无论是固定的或参数化,没有安全,从SQL注射

有关我的标准是很容易理解,使动态查询。但缺点我至今说的是,它加载一个都不少,一个等的关系,因为我们只有三种FetchModes即选择,代理服务器和默认,并在所有这些情况下,它会加载很多,一个(可能是我错了,如果是这样帮助我出:))

与准则第2个问题是,它加载完整的对象,即如果我想只加载雇员的EmpName它不会想出这个insted的它拿出完整的Employee对象,我可以从它那里得到EmpName由于这种<强>果然在上报工作不好。其中,作为HQL只是负载(我以前不负载关联/关系)移动你想要使性能提高很多倍。

标准的一个特征是,它会安全ü从SQL注入,因为其动态查询生成的,其中如在HQL作为乌尔查询被固定或参数化,从而不能从SQL注入安全。

此外,如果你在乌尔aspx.cs文件写入HQL,则紧密耦合与UR DAL。

总的来说,我的结论是,有其中u生活中不可缺少的HQL的地方,如报告,以便使用它们其他标准更易于管理。

对我来说最大的胜利条件的例API,在那里你可以通过一个目和休眠将建立一个查询的基础上的那些物体的特性。

除此之外,该标准API有其怪癖(我认为休眠队改造api),如:

  • 一标准。createAlias("obj")部队内部加入,而不是一个可能的外部加入
  • 你不能创建相同的别名的两倍
  • 一些sql条款没有简单的标准对应方(如一个子选择)
  • 等等。

我倾向于使用非常当我想要查询相似sql(从中删除的用户status="阻止"),而我倾向于使用标准的时候我不想使用的字符串的追加。

另一个优点非常的是,你可以界定所有的查询手之前,甚至externalise他们的文件。

标准API更适合动态产生查询,查询时过滤器是动态地应用在运行时间。因此,到 防止SQL注入攻击 当建设的动态查询的标准API是一个非常好的选择。

标准的查询较少的表现,你可以容易地结束了与一个非常复杂和无效率 SQL产生查询.我曾经加入了一个大企业应用程序的标准API是默认的查询方法,甚至没有广泛的代码-审查可能克服恐怖,不知道什么SQL queries我们要结束了。

JPQL或非常多表现,并且容易得多的预测相关的生成SQL query.它也是更容易向审查一个非常查询的比标准。

大多数实体查询使用的情况下不需要动态在条款,所以你可以实现大多数查询与JPQL同时保留标准的动态。

值得注意的是,选择实体与JPQL或标准API意义,如果需要修改它们。否则,也可与检突进行更好。检查了 这篇文章更多的信息.

标准API提供一个显着特征是无论是SQL或HQL提供。即。它允许编译查询的时间检查。

我们主要采用的标准在我们开始应用,但它与HQL代替由于性能问题之后。点击 我们主要使用的是非常复杂的查询与若干个连接导致多个查询的标准,但在HQL是非常优化。点击 此案是我们使用的特定对象只是几个化子性质,而不是完整的对象。随着标准的问题也是字符串连接。点击 我们说,如果你需要显示名称和用户在HQL这是很容易的姓(name || ' ' || surname)但在Crteria这是不可能的。点击 为了克服这个问题,我们使用ResultTransormers,那里有这样的地方串联是为需要的结果实现的方法。点击 今天,我们主要使用HQL是这样的:

String hql = "select " +
            "c.uuid as uuid," +
            "c.name as name," +
            "c.objective as objective," +
            "c.startDate as startDate," +
            "c.endDate as endDate," +
            "c.description as description," +
            "s.status as status," +
            "t.type as type " +
            "from " + Campaign.class.getName() + " c " +
            "left join c.type t " +
            "left join c.status s";

Query query =  hibernateTemplate.getSessionFactory().getCurrentSession().getSession(EntityMode.MAP).createQuery(hql);
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
return query.list();

所以在我们的情况下,返回的记录是需要的特性的图。

  • 非常的是执行两个选择的和非选择的操作上的数据,但条件是只为选择数据,我们无法执行的非选择的操作使用的标准
  • 非常适合用于执行静态查询,其中作为标准是适合的执行动态查询
  • 非常不支持分页的概念,但我们可以实现的页码的标准
  • 使用的标准采取更多的时间来执行,然后非常
  • 与标准,我们是安全的与SQL注,因为其动态查询一代,但在非常为你的查询,无论是固定的或参数化,没有安全,从SQL注射。

来源

标准查询动态我们可以根据我们的HQL查询的情况下inputs..In构造查询是静态查询一旦我们构建我们不能改变查询的结构。

我不希望在这里踢死马,但一提的是,现在的标准查询被弃用是很重要的。使用HQL。

我还优选为动态查询标准的查询。但我更喜欢HQL进行删除查询,例如,如果删除子表的父ID“XYZ”的所有记录,它很容易被HQL实现,但对于标准的API首先我们必须解雇删除查询数为n,其中n是孩子的数表中的记录。

这里的大多数的答案是误导性的,提及的是Criteria QueriesHQL,这实际上并非如此慢。

如果您钻研深,并执行一些测试,你会看到 标准的查询性能要好得多,经常HQL

和也条件查询你得到的面向对象的控制的这是不存在的就是 HQL

有关的更多信息这里阅读此答案

有另一种途径。我结束了创建基于Hibernate原有的语法分析器HQL所以它首先是解析HQL那么它可以动态地注入动力参数或自动添加一些常用的过滤器的HQL查询。它的伟大工程!

这职位是很老。大多数的回答谈到Hibernate的标准,而不是JPA标准。 JPA 2.1添加CriteriaDelete / CriteriaUpdate和EntityGraph控制究竟去取。标准API是更好,因为Java是面向对象的。这就是为什么创建JPA。当JPQL被编译,它会被转换为AST树(OO模型)之前转换为SQL。

HQL可引起的安全像SQL注入的担忧。

scroll top