web-dev-qa-db-fra.com

Spring data jpa - Comment combiner plusieurs And et Or via le nom de la méthode

J'essaie de migrer l'application. Je travaille depuis Hibernate to Spring Data Jpa.

Bien que Spring Data JPA propose des méthodes simples pour la construction de requêtes, je suis coincé dans la création d'une méthode de requête qui utilise à la fois And et Or operator.

MethodName - findByPlan_PlanTypeInAndSetupStepIsNullOrStepupStepIs(...)

Lorsqu'il se convertit en requête, les deux premières expressions sont combinées et s'exécutent en tant que [(exp1 and exp2) or (exp3)].

tandis que requis est ](exp1) and (exp2 or exp3)].

Quelqu'un peut-il me faire savoir si cela est réalisable via Spring data jpa?

26

Convenez avec Oliver sur des noms de méthode longs et illisibles, mais néanmoins et pour des raisons d'argument, vous pouvez obtenir le résultat souhaité en utilisant l'équivalence

A /\ (B \/ C) <=> (A /\ B) \/ (A /\ C)
A and (B or C) <=> (A and B) or (A and C)

Donc, dans votre cas, cela devrait ressembler à ceci:

findByPlan_PlanTypeInAndSetupStepIsNullOrPlan_PlanTypeInAndStepupStepIs(...)
21
Damir Djordjev

Option 1: Vous pouvez utiliser des requêtes nommées (voir tilisation des requêtes nommées JPA ):

@Entity
@NamedQuery(name = "User.findByEmailAddress",
  query = "select u from User u where u.emailAddress = ?1")
public class User {

}

public interface UserRepository extends JpaRepository<User, Long> {

   User findByEmailAddress(String emailAddress);
}

Option2 : utilisez @Query pour écrire vos requêtes personnalisées (voir tilisation de @Query )

public interface UserRepository extends JpaRepository<User, Long> {

   @Query("select u from User u where u.emailAddress = ?1")
   User findByEmailAddress(String emailAddress);
}
9
fateddy

Ce n'est actuellement pas possible et ne le sera pas à l'avenir. Je dirais que même si c'était possible, avec une requête plus complexe, vous ne voudriez pas compresser artificiellement toute la complexité de la requête dans le nom de la méthode. Non seulement parce qu'il devient difficile de digérer ce qui se passe réellement dans la requête, mais aussi du point de vue du code client: vous voulez utiliser des noms de méthode expressifs qui - dans le cas d'une simple findByUsername(…) - la requête la dérivation vous permet de créer.

Pour les choses plus complexes, il vous suffit d'élever la complexité de la requête dans le code appelant et il est préférable de passer à un nom de méthode lisible qui exprime sémantiquement ce que fait la requête et de conserver la complexité de la requête dans une requête déclarée manuellement en utilisant @Query, requêtes nommées ou similaires.

8
Oliver Drotbohm

Utilisez quelque chose comme

findByFirstElementAndCriteriaOrSecondElementAndCriteria

est comme (premier & condition) OR (second & condition) -> condition & (premier ou second)

6
leonardo rey