繁体   English   中英

Hibernate 嵌套属性条件

[英]Hibernate nested properties criteria

让我们假设,每首歌曲都只属于一个由居住在一个国家的艺术家创作的专辑。 像这样的查询

createCriteria(Song.class)
    .add(Restrictions.eq("album.artist.country.id", 43)); 

失败,可以使用createAliascreateCriteria (如此)修复,以便执行所需的连接。 我正在这样做并且它有效,但我缺少一些背景:

为什么它会这样工作? 假设没有嵌入属性,加入是唯一的选择,不是吗?

关于连接类型,没有歧义:它必须是内部连接,否则等式不成立,对吧?

关于为什么要以这种方式构建某些东西的问题总是很棘手,您可能需要直接询问作者。

我找不到任何关于此的官方文档,但我认为它与基于字符串的查询 (HQL) 与基于对象的查询(标准)有关。

无论如何,您编写的查询比 Criteria 更 HQL,那么为什么不为整个查询使用 HQL?

我知道这只是您编写的一个简短示例来描述该概念,并且在更复杂的 Criteria 查询中使用基于字符串的路径导航连接可能也很方便,但 Criteria 的重点是提供更多类型安全的查询和可重用的标准部分,您可以根据影响最终查询外观的各种其他条件,使用它们来分块构建查询。

例如,假设您为所有实体属性预定义了常量,以便确保在使用基于字符串的查询时不会出现任何拼写错误:

public final class Album_ {
  public static final String artist = "artist";
}

public final class Artist_ {
  public static final String country = "country";
}

有一些工具/框架可以自动生成这些类。

因此,您可以通过以下方式生成 Criteria:

createCriteria(Song.class)
 .createCriteria(Album_.artist)
 .createCriteria(Artist_.country)
 ...

对于大多数查询,上述方法是不必要的开销,并且会降低代码的可读性,恕我直言(我个人认为 HQL/JPQL 更具可读性,即使涉及StringBuilder或类似内容),但我认为这是 Criteria 背后的基本思想:更安全和更可重用的查询部分。

关于连接类型,没有歧义:它必须是内部连接,否则等式不成立,对吧?

您应该使用内部联接。

为什么它会这样工作?

因为hibernate会生成,所以你应该放别名。

你有没有想过 Hibernate Native SQL 呢? 因为会对数据库进行混乱的查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM