3 votes

Spring Boot : Custome @Query avec 2 crochets consécutifs cause qu'une paire est ignorée

Dans mon JpaRepository, j'ai la @Query suivante :

@Query("SELECT m FROM Msg m WHERE ((m.from = ?1 AND m.to = ?2) OR (m.from = ?2 AND m.to = ?1))  AND m.time = ?3")
Msg find(String firstId, String secondId, long lastAccess);

Cependant, dans la console de journalisation, cette requête est enregistrée sans les crochets supérieurs et il semble qu'elle soit exécutée de cette façon :

SELECT m FROM Msg m WHERE (m.from = ?1 AND m.to = ?2) OR (m.from = ?2 AND m.to = ?1)  AND m.time = ?3

Alors comment ajouter correctement plusieurs parenthèses consécutives ?


J'utilise :

Derby

Spring Boot 1.4.3.RELEASE

2voto

Szymon Stepniak Points 17693

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 ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X