2017-07-03 3 views
0

Ich habe eine Einheit, die durch die folgende Repository ausgesetzt:Spring Data Rest: Abfrageparameter mit logisch verketteten OR

public interface InsertRepository extends PagingAndSortingRepository<InsertEntity, Long>, QueryDslPredicateExecutor<InsertEntity>, QueryDslBinderCustomizer<QInsertEntity> { 
    @Override 
    default void customize(QuerydslBindings bindings, QInsertEntity insert) { 
     bindings.bind(String.class).all(StringPath path, Collection<? extends String> values) -> { 
      BooleanBuilder predicate = new BooleanBuilder(); 
      values.forEach(value -> predicate.or(path.containsIgnoreCase(value))); 

      return predicate; 
     }); 
    } 
} 

Was ich möchte ist zu tun, dass alle GET-Abfrageparameter verkettet werden als logische oder so, dass eine Abfrage wie ?description=searchText&customerName=searchText würde eine SQL-Abfrage ausführen, die wie folgt aussieht:

WHERE description LIKE '%searchText%' OR customerName LIKE '%searchText%'

Allerdings muss ich etwas falsch machen, weil es nicht funktioniert - es setzt alle Abfrageparameter in eine AND Abfrage. Dies führt dazu, dass nur diejenigen Datensätze ausgewählt werden, die in Kundenname AND deren Beschreibung enthalten.

+1

TypeBinder $ all() ermöglicht es Ihnen, ein Mehrwert anpassen Bindung, die Sie angeben, indem Sie Pfad oder nach Klasse. Aber selbst wenn Sie eine Bindung "nach Klasse" anpassen, werden Abfrageparameter nicht global behandelt. Zum Beispiel –

+0

@MarcTarin Okay, wenn ich Sie richtig verstehe, kann ich nicht erreichen, was ich brauche mit der 'customize' Methode, oder? – Ahatius

+1

Zum Beispiel '? Description = searchText & description = searchInt' wird dir' WHERE description LIKE '% searchText%' ODER description LIKE '% searchInt%' 'geben. Häufigkeit von 'customerName' wird als separate Klausel verarbeitet, und alle Klauseln werden mit AND verknüpft. Also nein, nach meinem besten Wissen können Sie mit der 'customize' Methode nicht erreichen, was Sie brauchen. –

Antwort

1

Sie können benannte Parameter verwenden wie
Beispiel 53 Unter Verwendung benannter Parameter

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation

public interface UserRepository extends JpaRepository<User, Long> { 
    @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname") 
    User findByLastnameOrFirstname(@Param("lastname") String lastname, 
           @Param("firstname") String firstname); 
} 
+0

Dazu müsste ich eine neue Controller-Methode erstellen, die wiederum die Methode aufrufen würde. Ich versuche, dieses Verhalten über die normale REST-Schnittstelle offenzulegen, so dass ich keine spezifische Methode für die Abfrage aufrufen muss. – Ahatius

+0

Das Framework generiert automatisch einen '/ search/findByLastnameOrFirstname' Endpunkt für Sie. –

Verwandte Themen