2012-08-29 7 views
23

CrudRepositoryインターフェイスを拡張すると、私のサブインターフェイスにexists(ID)メソッドがあります。私はfindBy<property>メソッドを書くことができます。春データCrudRepositoryが存在します

何とかbooleanを返すexistBy<property>メソッドを書き込むことは可能ですか?または@Query(jpa query)と注釈を付けるため、booleanを返します。

私はselect count(*)を返すことができ、longを返すことがわかっていますが、!=0のサービスレイヤをチェックする必要があります。

+1

「はその後私がしなければならないだろう、私のサービス層で= 0チェック!。」また、countの代わりにexistを使用すると、dbクエリのほうが若干効率的になります。 – WeGa

答えて

2

あなたがorg.springframework.data.jpa.repository.support.SimpleJpaRepository.exists(ID)のソースを見れば、あなたはそれがレコードとリターンをカウントするTypedQueryを使用していることがわかります。

query.getSingleResult() == 1 

あなたはexistsBy(...)方法について同様の何かをするクエリを作成することができます。

+1

ええ、私はソースコードを調べました。それまでにDaoインターフェイスを実装する必要があります。私は解決策を探していました=それをする必要はありません=) –

19

実はあなたはこのようなケースの表現を使用することができます。

select case when count(e) > 0 then true else false end from Entity e 
where e.property = ?1 -- here go your conditions 
19

オレクサンドルの答えが正しいですが、次のように私はそれが仕事を得ることができる唯一の方法であります@。 PostgreSQLでEclipselinkを使用しています。春データJPA 1.11.0.RELEASEのよう

public interface UserRepository extends JpaRepository<User, Long> 
{ 
    @Query("SELECT CASE WHEN COUNT(u) > 0 THEN 'true' ELSE 'false' END FROM User u WHERE u.username = ?1") 
    public Boolean existsByUsername(String username); 
} 
+0

v1.11.0より前のSpring Dataの良い回避策です。 @ alexander-camperovあなたの問題を解決することに同意するなら、この回答を受け入れてください。 – naXa

9

、あなたは今、メソッド名からクエリ派生でexistsを使用することができます。あなたはemailプロパティを持つUser実体を持っている場合たとえば、あなたはこれを行うことができます。

public interface UserRepository extends JpaRepository<User, Long> { 

    boolean existsByEmail(String email); 
} 
+0

'existsBy'は今では壊れているようです:C https://jira.spring.io/browse/DATAJPA-851 –

関連する問題