1

JPQLで次の問題が発生します。1つのクラスに3つのフィールドがあります。

public class Message{
  Integer ownerId;
  Integer fromUserId;
  Integer toUserId;
  //rest of implementation
}

次に、ユーザー名でデータベースを検索したいのですが、このメッセージには所有者、受信者、送信者の3人のユーザーが関連付けられているため、SQLで行ったことは次のとおりです。

SELECT * FROM message m 
LEFT JOIN user o ON m.owner_id=o.id 
LEFT JOIN user fu ON m.from_user_id = fu.id
LEFT JOIN user tu ON m.to_user_id = tu.id
WHERE o.name like '%foo%' OR fu.name like '%foo%' OR tu.name like '%foo%';

これはおそらく最速のクエリではありませんが、正常に機能します。それからJPQLに翻訳したかったのですが、簡単ではありません。'on'トークンで例外が発生します。クラスに別のクラスへのリレーションが定義されている場合、JOINが可能であることを理解していますが、1つのメッセージに3人のユーザーが関連付けられているため、リレーションは少し複雑です。これを解決する方法はありますか?

4

2 に答える 2

6

私はこれがトリックを行うべきだと思います:

FROM message m                -- SELECT * is optional in JPQL
LEFT JOIN m.owner o           -- In JPQL, you put the path to the related object
LEFT JOIN m.from_user_id fu   -- and JPA does the rest using the mappings
LEFT JOIN m.to_user_id tu
WHERE o.name like '%foo%' OR fu.name like '%foo%' OR tu.name like '%foo%';

覚えておくべきことは、JPQLではJOIN条件がマッピングで定義されているため、クエリでそれらを指定しないことです。参照するオブジェクトへのパスを入力するだけで、JPAはマッピングから残りを推測します。

于 2012-09-19T21:03:33.047 に答える
1

Spring Data JPAバージョン2.1.5(2019年2月)を使用しており、次の例に示すように、複数の左結合が機能しています。

@Query("select parentMenu from ObMenu parentMenu "
            + "left join ObTreeNode parentTreeNode on parentMenu.id=parentTreeNode.nodeId "
            + "left join ObTreeNode childTreeNode on parentTreeNode.nodeId=childTreeNode.parentId "
            + "where  childTreeNode.nodeId=:childMenuId")
    ObMenu findParentMenu(@Param("childMenuId") String childMenuId);   
于 2020-01-23T20:04:37.413 に答える