16

@Queryアノテーション(org.springframework.data.jpa.repository.Query;)にサブクエリを含めることが可能かどうか知りたいのですが。

最初のサブクエリの括弧でQuerySyntaxExceptionが発生します。

これが私の質問です

@Query(value="select c1 from ComplaintModel c1, "
+ "(select c2.id, min(cb.termDate) minDate from ComplaintModel c2 "
+ "join c2.complaintBullets cb join cb.status s where s.code = ?1 "
+ "group by c2.id) tmp where c1.id = tmp.id order by tmp.minDate")

ありがとう!

4

3 に答える 3

18

いいえ、JPQL クエリの select 句にサブクエリを含めることはできません。

JPQL は、WHERE 句と HAVING 句でサブクエリをサポートします。(少なくとも) ANY、SOME、ALL、IN、EXIST 式の一部にすることができ、もちろん通常の条件式を使用することもできます。

SELECT a
FROM A a
WHERE a.val = (SELECT b.someval 
               FROM B b 
               WHERE b.someotherval=3)
于 2012-03-17T17:30:10.297 に答える
4

Spring-data jpa で期待どおりの結果が得られました

public final static String FIND_BY_ID_STATE = "SELECT a FROM Table1 a RIGHT JOIN a.table2Obj b " +
                                              "WHERE b.column = :id" +
                                              "AND a.id NOT IN (SELECT c.columnFromA from a.table3Obj c where state = :state)";


@Query(FIND_BY_ID_STATE)
public List<Alert> findXXXXXXXX(@Param("id") Long id, @Param("state") Long state);

どこ

Table2Obj と Table3Obj は、それぞれエンティティ Table1 と Table2、Table3 の間の関係のマッピングです。

以下のように定義されます。

@OneToMany(mappedBy = "xxx", fetch = FetchType.LAZY)
private Set<Table2> table2Obj = new HashSet<>();
于 2016-08-19T11:22:03.387 に答える
0

アノテーションの内容は、@Queryを呼び出すことによって永続化プロバイダにほぼそのまま渡されEntityManager.createQuery(…)ます。そこで許可されているものは何でも で使用できます@Query。AFAIK、JPQL(JPA 2.0の時点まで)は、EXISTSandIN句のサブクエリのみをサポートしています。

于 2012-03-29T22:24:29.973 に答える