web-dev-qa-db-fra.com

Données de printemps CrudRepository existe

Lorsque j'étends l'interface CrudRepository, j'ai la méthode exists(ID) dans ma sous-interface. Je peux écrire des méthodes findBy<property>.

Est-il possible en quelque sorte d'écrire la méthode existBy<property> Qui retournera boolean. Ou pour l'annoter avec @Query(jpa query) afin qu'il renvoie boolean.

Je sais que je peux faire select count(*) et retourner long, mais alors je devrai faire !=0 Vérifier dans ma couche de service.

27
Alexander Camperov

@ La réponse d'Oleksandr est correcte, mais la seule façon de le faire fonctionner est la suivante. J'utilise Eclipselink sur PostgreSQL.

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);
}
22
Adam

En fait, vous pouvez utiliser une expression de casse comme celle-ci:

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

Depuis Spring Data JPA 1.11.0.RELEASE, vous pouvez désormais utiliser exists avec dérivation de requête à partir des noms de méthode. Par exemple, si vous avez une entité User avec une propriété email, vous pouvez le faire:

public interface UserRepository extends JpaRepository<User, Long> {

    boolean existsByEmail(String email);
}
12
Jacob Wallace

Si vous regardez la source de org.springframework.data.jpa.repository.support.SimpleJpaRepository.exists(ID) alors vous verrez qu'il utilise un TypedQuery pour compter les enregistrements et retourne:

query.getSingleResult() == 1

Vous pouvez créer une requête qui fait quelque chose de similaire pour vos méthodes existsBy(...).

2
Rich Cowin