gpt4 book ai didi

java - 具有自连接的 Hibernate 条件

转载 作者:行者123 更新时间:2023-11-29 02:55:33 25 4
gpt4 key购买 nike

上周一直在学习 Hibernate、Spring 和 JPA,但一直在尝试为以下场景创建条件:

假设我有 2 个表:

游戏

  • 编号

玩过的游戏

  • 编号
  • account_ref -> 对一些账户表的引用
  • game_id -> 对游戏的引用

实体映射:

Game {

@id
Long id;

@OneToMany(mappedBy = "game")
Set<Player> players;

}

PlayedGame {

@id
Long id;

Long account_ref;

@ManyToOne
@JoinColumn(name = "game_id", referencedColumnName = "id")
Game game;
}

现在我想查询以下场景: - 我想找到特定玩家 (P) 玩过的所有游戏,其中玩家 (A) 是其中的一部分。更具体地说,属于同一个游戏的两个人

在 SQL 中,这可以通过类似的方式完成(查询应该是):

SELECT DISTINCT p1.* FROM Player as p1 
INNER JOIN Player as p2 ON p1.game_id=p2.game_id
WHERE p1.account_ref=P AND p2.account_ref=A

这可以用 Hibernate 中的 Criteria 巧妙地完成吗?

最佳答案

也许可以使用 Hibernate 的 Criteria API,但不是直接的。

一个简单的案例需要将相同的关联路径连接两次(一次用于A,一次用于P):

Criteria gameCriteria = ((HibernateEntityManager) em).getSession().createCriteria(Game.class);

Criteria playedGamesOfACriteria = gameCriteria.createCriteria("playedGames", "pga");
Criteria accountOfACriteria = playedGamesOfACriteria.createCriteria("account", "a");
accountOfACriteria.add(Restrictions.idEq(a.id));

Criteria playedGamesOfPCriteria = gameCriteria.createCriteria("playedGames", "pgp");
Criteria accountOfPCriteria = playedGamesOfPCriteria.createCriteria("account", "p");
accountOfPCriteria.add(Restrictions.idEq(p.id));

return gameCriteria.list();

由于 HHH-879,这将不起作用.

但是您可以使用 JPA 查询:

Query q = em.createQuery(
"select g "
+ "from Game g "
+ "join g.playedGames pga "
+ "join pga.account a "
+ "join g.playedGames pgp "
+ "join pgp.account p "
+ "where a = ?1 and p = ?2"
);
q.setParameter(1, a);
q.setParameter(2, p);
return q.getResultList();

这是更少的代码。

此外:有些人认为 Criteria API 是 deprecated .

关于java - 具有自连接的 Hibernate 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31029593/

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