web-dev-qa-db-ja.com

Spring Data JPAおよびExistsクエリ

Spring Data JPA(JPAプロバイダーとしてHibernateを使用)を使用しており、HQLクエリを添付したexistsメソッドを定義したい:

public interface MyEntityRepository extends CrudRepository<MyEntity, String> {

  @Query("select count(e) from MyEntity e where ...")
  public boolean existsIfBlaBla(@Param("id") String id);

}

このクエリを実行すると、Java.lang.ClassCastException: Java.lang.Long cannot be cast to Java.lang.Booleanが返されます。

この機能を実現するには、HQLクエリはどのように見える必要がありますか?単にLong値を返し、その後count > 0であればJavaコードをチェックインできますが、その回避策は必要ないはずですよね?

43
Stefan Haberl

クエリを変更してブール値を返すことができると思います

@Query("select count(e)>0 from MyEntity e where ...")

PS:主キーの値CrudRepositoryに基づいて存在することを確認する場合は、exists(id)メソッドが既にあります。

57

Spring Data JPA 1.11は、リポジトリクエリ派生でexistsプロジェクションをサポートするようになりました。

ドキュメントを参照してください こちら

あなたの場合、以下が機能します:

public interface MyEntityRepository extends CrudRepository<MyEntity, String> {  
    boolean existsByFoo(String foo);
}
128
Ankit Soni

私の場合、次のようには機能しませんでした

@Query("select count(e)>0 from MyEntity e where ...")

次のようにブール値として返すことができます

@Query(value = "SELECT CASE  WHEN count(pl)> 0 THEN true ELSE false END FROM PostboxLabel pl ...")
9
Runomu

Springデータ1.12以降、QueryByExampleExecutorインターフェイスを拡張することにより、関数の例によるクエリを使用できます(JpaRepositoryalreadyはそれを拡張します)。
次に、このクエリを使用できます(特に)。

<S extends T> boolean exists(Example<S> example);

エンティティMyEntityを考えます。プロパティnameとして、大文字と小文字を無視して、その名前のエンティティが存在するかどうかを知りたい場合、このメソッドの呼び出しは次のようになります。

//The ExampleMatcher is immutable and can be static I think
ExampleMatcher NAME_MATCHER = ExampleMatcher.matching()
            .withMatcher("name", GenericPropertyMatchers.ignoreCase());
Example<MyEntity> example = Example.<MyEntity>of(new MyEntity("example name"), NAME_MATCHER);
boolean exists = myEntityRepository.exists(example);
8
Stephane L

受け入れられた答えとは別に、私は別の代替案を提案しています。 QueryDSL を使用して、述語を作成し、述語を受け入れてブール値を返すexists()メソッドを使用します。

QueryDSLの利点の1つは、複雑なwhere句に述語を使用できることです。

2
Narasimha

以下のように、選択クエリでCaseを返すためにboolean式を使用できます。

@Query("SELECT CASE WHEN count(e) > 0 THEN true ELSE false END FROM MyEntity e where e.my_column = ?1")
0
Sahil Chhabra