2017-07-03 1 views
0

とチェーンのクエリパラメータは、私は以下のリポジトリで公開されたエンティティがあります。私はそれが何をしたいのですがどのような春データレクリエーション:論理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; 
     }); 
    } 
} 

をすべてGETクエリパラメータを論理として連鎖されているということです?description=searchText&customerName=searchTextのようなクエリが見えますSQLクエリを実行しますように、OR、次のように:

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

をしかし、それは動作しませんので、私は何か間違ったことしなければならない - それはにすべてのクエリパラメータを入れていますクエリ。その結果、顧客名searchTextが含まれ、その説明がであるレコードのみが選択されます。あなたはこのような
例として名前付きパラメータを使用する53使用して、指定されたパラメータ

でき

+1

TypeBinder $、すべての()を使用すると、複数値は、あなたがで指定することをバインドをカスタマイズすることができますパスまたはクラス別に表示されます。しかし、クラスごとにバインディングをカスタマイズしても、クエリパラメータはグローバルには扱われません。例えば –

+0

@MarcTarin大丈夫ですので、正しく理解すれば 'customize'メソッドを使って必要なものを達成することはできません。 – Ahatius

+1

たとえば、 '?description = searchText&description = searchInt'は、' WHERE description LIKE '%searchText%' OR description LIKE '%searchInt%' 'を与えます。 「customerName」のOccurenceSは別個の句として処理され、すべての句はANDで結合されます。だから、私の知る限りでは、 'customize'メソッドで必要なものを達成することはできません。 –

答えて

1

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

これは、新しいコントローラメソッドを作成して、メソッドを呼び出す必要があります。私は通常のRESTインターフェイスを介してその動作を公開しようとしているので、クエリに対して特定のメソッドを呼び出す必要はありません。 – Ahatius

+0

フレームワークは自動的に '/ search/findByLastnameOrFirstname'エンドポイントを生成します。 –