J'ai fait quelques petites recherches en utilisant Spring Boot 1.4.3-RELEASE y 1.5.4-RELEASE avec deux dépendances :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
J'ai imité votre JpaRespository :
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
interface PersonRepository extends JpaRepository<Person, Long> {
@Query("SELECT p FROM Person p WHERE ((p.firstName = :firstName AND p.lastName = :lastName) OR (p.firstName = :lastName AND p.lastName = :firstName)) AND p.age = :age")
Person findWithCustomQuery(@Param("firstName") String firstName, @Param("lastName") String lastName, @Param("age") Integer age);
}
Voici ce que Person
ressemble à une classe :
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String firstName;
private String lastName;
private Integer age;
}
Voici le code source complet : https://github.com/wololock/stackoverflow-answers/tree/master/45629734
La requête SQL qui est exécutée est la suivante :
select person0_.id as id1_0_, person0_.age as age2_0_, person0_.first_name as first_na3_0_, person0_.last_name as last_nam4_0_ from person person0_ where (person0_.first_name=? and person0_.last_name=? or person0_.first_name=? and person0_.last_name=?) and person0_.age=?
Comme vous pouvez le voir, les parenthèses ont été simplifiées en
(person0_.first_name=? and person0_.last_name=? or person0_.first_name=? and person0_.last_name=?)
mais c'est toujours correct puisque and
est plus prioritaire que l'opérateur or
opérateur.
Plus d'informations nécessaires
Je suis impatient de vous aider à trouver une solution à votre problème, mais j'aurai besoin de plus d'informations, par exemple
- quelle base de données utilisez-vous (j'ai utilisé H2 dans cet exemple et il est évident qu'un dialecte SQL différent peut générer des requêtes différentes) ?
- Quelle version de Spring Boot utilisez-vous ?
- Quelle version de Spring Data utilisez-vous ?