【问题标题】:How to use Hibernate Criteria API without Entity classes?如何在没有实体类的情况下使用 Hibernate Criteria API?
【发布时间】:2012-05-23 20:14:20
【问题描述】:

我想利用 Criteria API 的 db 独立 HQL 和类型安全性。但我没有实体类。

我可以直接使用 Criteria API 吗?

【问题讨论】:

  • 自己回答的问题:在不知道实体类型和实体属性的情况下如何实现类型安全?
  • 类型安全是指在编译时验证查询。无法在编译时检查字符串查询。
  • 我们知道这一点,但是在不知道您是否获得正确的实体以及该实体是否具有您在查询中访问的字段的情况下,您将如何验证查询?
  • 我同意实体有额外的好处。但我不知道编译期间的实体。 Still Criteria API 比普通的 HQL 更好

标签: java hibernate criteria-api hibernate-criteria


【解决方案1】:

不,你不能。 HQL 和 Criteria API 的重点是根据实体及其之间的关联来查询对象模型。

【讨论】:

  • 我不会同意这种说法。 ORM 只是 HQL 和 Criteria API 的特性之一。 Criteria API 与 ORM 关系不大。
  • @SumeetJindal:那么,当你在做criteria.createAlias("category.products", "category"); 时,如果你没有一个与 Product 实体有 toMany 关联的 Category 实体,你希望它如何工作?
  • 我不关心关联。我想要基本的 sql 类操作
  • 标准和 HQL 不使用 SQL。他们将其替换为适用于实体的语言和 API。但是,如果您认为您知道自己问题的答案,那您为什么要问它。去尝试使用没有实体的 HQL。
【解决方案2】:

首先,很高兴注意到 Criteria API 通常用于替代 HQL 来构建动态查询(“HQL 非常强大,但一些开发人员更喜欢使用面向对象的 API 来动态构建查询,而不是构建查询字符串" reference link)。

其次,Hibernate 是一个对象/关系(数据库)持久化实现。为了使用 我们需要定义其对象应映射到目标数据库表(实体)的类。

对于使用域类为 Hibernate 会话获取 Criteria API:

Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();

Session 对象使用从“Cat”类到其对应表(可能在数据库中命名为“Cat”)的映射。

所以,最终没有实体类及其映射,没有 Session 对象。而且没有 Session ,没有 Criteria 对象。

Criteria 需要知道需要查询的 Classes (Cat.class)。

【讨论】:

  • 给定链接中解释的技术第一次听起来很棒。但它有很多缺点。首先,您的代码不是“类型安全的”,并且您无法在编译时检查 Map 的值(及其类型)是否真的对应于您希望映射的实体表。其次,作为后果,您可能会遇到许多通用运行时异常。最后他们说该功能目前处于试验阶段,未来可能会发生变化。暂时不稳定,我试试看
  • @Sumeet Jindal 和一个主要问题是,正如已经解释过的,“标准”API 需要对象的 .class 来查询。将动态 Map 作为“实体模式”,Criteria 不知道将选择哪个类/实体,因为唯一可用的给定类型是“MAP”。
【解决方案3】:

你如何告诉hibernate你想应用哪个类??

所以你必须在 createcriteria(Entity.class) 中传递实体类名。

而且你... Criteria 提供了丰富的功能,这将减少您的代码。

但请注意……所有事物都有正负点。

标准也有一些负面影响...

所以.. 小心点。根据您的应用程序相关规范使用

【讨论】:

    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 2016-05-19
    • 2014-02-06
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 2016-01-15
    相关资源
    最近更新 更多