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.
@ 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);
}
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
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);
}
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(...)
.