gpt4 book ai didi

java - 在 Hibernate 中使用 "ON clause"获取连接的替代方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:25:19 25 4
gpt4 key购买 nike

给定以下 RDBMS 中的域模型,该模型使用 Hibernate 映射到 Java 对象。

┌─────────┐            ┌─────────────┐
│ Project │ 1 0..n │ UserSetting │
├─────────┼------------┼─────────────┤
│ name │ │ username │
└─────────┘ │ favorite │
└─────────────┘

用户可以将项目标记为最喜欢的项目,这反射(reflect)在关联的(可选)UserSetting 条目中。如果用户没有标记项目,则数据库中没有 UserSetting 条目,这意味着该项目不受欢迎。将 UserSetting 视为“稀疏”。

进一步给出:应通过 JPA 以 Hibernate 作为提供者获取实体。

假设 ProjectUserSetting 表可能非常大。优化数据库模式不应该受到这个问题的影响。假设存在有效索引。

对于给定的用户,我想高效地获取所有项目,包括该特定用户的 Collection 状态。注意排序标准!

我最初的方法是制定以下 JPQL 查询:

SELECT p, us FROM Project p
LEFT JOIN FETCH UserSetting us
WHERE us.username IS NULL OR us.username = :currentUser
ORDER BY COALESCE(us.favorite, false) DESC, p.name ASC

如果 currentUser 没有UserSettinguserB 有,这将不起作用。 userBUserSetting 将被加入,但由于 WHERE 子句,该项目将不会被列出。

幸运的是,JPA 2.1 introduces JOINS with ON clause ( Javadoc ) 可用于将查询重新表述为:

SELECT p, us FROM Project p
LEFT JOIN FETCH UserSetting us
ON us.username IS NULL OR us.username = :currentUser
ORDER BY COALESCE(us.favorite, false) DESC, p.name ASC

不幸的是,Hibernate (4.3.6) 不支持使用“ON 子句”(Hibernate 语言中的“WITH 子句”)的提取连接并退出并出现以下异常:

org.hibernate.hql.internal.ast.QuerySyntaxException: with-clause not allowed on fetched associations; use filters

如何重新制定查询以实现功能并满足我的约束:

  • 固定领域模型
  • 可扩展的高效查询
  • JPA + hibernate
  • 应避免使用 Hibernate 的特定功能

最佳答案

您也可以使用以下方法在没有 UserSettings 的情况下检索项目:

SELECT p, us FROM Project p
LEFT JOIN FETCH UserSetting us
WHERE us is null OR us.username IS NULL OR us.username = :currentUser
ORDER BY COALESCE(us.favorite, false) DESC, p.name ASC

 us is null

查询的 WHERE 子句中的部分可以解决问题。

关于java - 在 Hibernate 中使用 "ON clause"获取连接的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25004892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com