Hibernate 嵌套属性标准

Hibernate nested properties criteria

让我们假设,每首歌曲都属于一张专辑,该专辑由居住在一个国家/地区的一位艺术家创作。像

这样的查询
createCriteria(Song.class)
    .add(Restrictions.eq("album.artist.country.id", 43)); 

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

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

关于join类型,没有歧义:必须是INNER JOIN,否则等式不成立,对吧?

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

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

无论如何,您编写的查询比 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";
}

有 tools/frameworks 自动生成这些 类。

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

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

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

Concerning the join type, there's no ambiguity: It must be an INNER JOIN, otherwise the equality could not hold, right?

您应该使用 INNER JOIN。

Why does it work like this?

因为hibernate生成,所以你应该输入别名。

您是否考虑过 Hibernate Native SQL?因为查询数据库会很乱。