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

标签 java jpa self-join

我的问题与这个老问题非常相似: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/

相关文章:

java - 意外的 JPA 错误 :Invalid column name

java - 如何使用 jpa spring 查明电子邮件是否已经存在并向前端发送一些错误消息

mysql - 将查询中的 NULL 值替换为另一行的值

sql - 什么是 SELF JOIN?什么时候会使用它?

java - Apache Ignite - 如何在以编程方式启动节点时启用 Rest API?

java - 将java按钮添加到LinearLayout

java - Spring 使用 EntityManager 启动多个数据源

java - Gwt Request builder - 如何返回响应字符串

java - Swing JLabel 缺少字符

mysql - 为什么我使用这些 HQL 查询得不到任何数据?