gpt4 book ai didi

java - JPA Criteria API 和同一路径表达式上的两个联接

转载 作者:行者123 更新时间:2023-11-30 06:38:05 26 4
gpt4 key购买 nike

我的问题与这个老问题非常相似:Hibernate Criteria with self join但我需要一个非 Hibernate 特定的、干净的 JPA 解决方案来解决相同的问题。我目前使用 Hibernate 4.3 作为 JPA 提供程序,但如果需要我可以更新它。我有以下实体:

  • 游戏,可以有许多结果条目,每个玩该游戏的玩家一个
  • GameResult游戏拥有并引用参与的玩家。它没有对所属游戏的反向引用
  • 玩过游戏的玩家

现在我想创建一个查询来查找我与特定对手进行的所有比赛并检索我们的分数。我收到以下 JPA 查询:

String strQuery = "SELECT g, my_result, their_result FROM Game g JOIN g.results my_result JOIN  g.results their_result WHERE my_result.player=:p1 AND their_result.player=:p2";

它似乎有效,但我想将其转换为 Criteria API,而对于 Criteria API,我是一个十足的菜鸟。我首先得到以下信息:

Root<Game> game = query.from(Game.class);
Join<Game, GameResult> result_mine = game.join("results");

到目前为止,一切都很简单。但现在我不知道如何将 result_theirs 与这部分结合起来。我尝试了以下方法:

Join<Game, GameResult> result_theirs = game.join("results");
result_mine.join( *what should I put here* , result_theirs);

//or:
Selection<Game> alias_game = game.alias("g");
Join result_theirs = result_mine.join(alias_game, "results"); //does not compile

//or:
Join result_theirs = result_mine.join(game.get("results")); //does not compile


//or:
Join<Game, GameResult> result_theirs = game.join("results");
result_mine.join(result_theirs); //does not compile

我错过了一些东西,但我不知道是什么,或者也许我走错了方向。

那么,我做错了什么以及如何将上述 JPA 查询转换为 Criteria API 代码?

最佳答案

你的第三个或是正确的,只是你加入了两次

您的线路result_mine.join(result_theirs);尝试加入GameResultGameResult这是无法完成的,因为您的实体映射仅指定如何加入 GameGameResult (但不是 GameResult 到 GameResult)前者已经由 Join<Game, GameResult> result_theirs = game.join("results"); 完成。

所以做如下的事情

CriteriaQuery<Tuple> query = cb.createTupleQuery();
Root<Game> game = query.from(Game.class);
Join<Game, GameResult> result_mine = game.join("results");
Join<Game, GameResult> result_theirs = game.join("results");
query
.multiselect(game, result_mine, result_theirs)
.where(
cb.equal(result_mine.get("player"),p1),
cb.equal(result_theirs.get("player"),p2)
);
List<Tuple> results = em.createQuery(query).getResultList();

关于java - JPA Criteria API 和同一路径表达式上的两个联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44865806/

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