0

こんにちは私は、特定の値を持つ多対多のテーブルに接続されたレコードを持たない1つのテーブルからレコードを選択しようとしています。

サンプルテーブルで説明します。

documentation:
id_documentation
irrelevant_data

user:
id_user
irrelevant_data


documentation_user:
id_documentation
id_user
role

私が達成したいのは、特定の役割のユーザーがいないすべてのドキュメントを選択することです。何か案は?

主な問題は、JavaのCriteriaBuilderを使用してクエリを作成しているため、サブクエリを使用できないことです(私は思います)。

4

3 に答える 3

0

主な問題は存在しません-CriteriaAPIにはSubQueryがあります。クエリ自体はUserのインスタンスを選択し、サブクエリに基づいて結果を制限するために構成に含まれないものを使用します。 サブクエリは、DocumentationUserを介して特定の役割を持つドキュメントに接続しているすべてのユーザーを選択します。

于 2013-02-24T21:08:17.030 に答える
0

次のようなものを試してください(コードはテストされていません):

CriteriaQuery<Documentation> cq = cb.createQuery(Documentation.class);
Root<Documentation> u = cq.from(Documentation.class);
Subquery<Integer> sq = cq.subquery(Integer.class);
Root<User> su = sq.from(User.class);
sq.select(su.get("id_user"));
Join<User, DocumentationUser> du = su.join("documentationUserCollection");
sq.where(cb.equals(du.get("role"), "mySpecificRole"));
cq.where(cb.not(cb.in(u.get("id_user")).value(sq)));

SO に関するこの便利な回答も参照してください。

于 2013-02-25T10:02:44.083 に答える
0

createAlias(java.lang.String, java.lang.String, int, org.hibernate.criterion.Criterion)メソッドを使用して、左結合に制限を追加できます。 APIを参照してください。

基準で左結合を使用する方法の例については、この回答を確認してください。

于 2013-02-24T21:24:13.813 に答える