仕様 ?
仕様を使用して、WHERE
を動的に生成できます Springデータクエリの一部。SpringデータJPAクエリで仕様を使用するには、org.springframework.data.jpa.repository.JpaSpecificationExecutor
を拡張する必要があります。 インターフェース。したがって、ユーザーリポジトリは次のようになります。
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}
検索方法は次のようになります
public List<User> getAllFilterByString(String text) {
if(StringUtils.isEmpty(text))
return userRepository.findAll();
Specification<User> specification =
(root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.like(cb.lower(root.get("name")), "%"+text.toLowerCase()+"%"));
//check if the text value can be casted to long.
//if it is possible, then add the check to the query
try {
long longValue = Long.valueOf(text);
predicates.add(cb.equal(root.get("id"), longValue));
}
catch (NumberFormatException e) {
//do nothing, the text is not long
}
//check if the text can be casted to boolean
//if it is possible, then add the check to the query
Boolean value = "true".equalsIgnoreCase(text) ? Boolean.TRUE :
"false".equalsIgnoreCase(text) ? Boolean.FALSE : null;
if(value != null) {
predicates.add(cb.equal(root.get("isActive"), value));
}
return cb.or(predicates.toArray(new Predicate[] {}));
};
return userRepository.findAll(specification);
}
まず、name LIKE %text%
を追加することから始めます where式の一部。
次に、text
の値を確認します 変数はlong
にキャストできます 。可能であれば、文字列からlong値を取得し、それをwhereクエリに追加します。
最後に、text
かどうかを確認します 変数はブール値にキャストできます。可能であれば、そのチェックもクエリに追加します。
たとえば、text
の値が 変数はtest1 場所の部分は
WHERE name LIKE '%test1%;
text
の値の場合 変数はtrue 次に、どこの部分になりますか
WHERE name LIKE '%true%' OR is_active = true;
最後に、text
の値が 変数は12 次に、どこの部分になりますか
WHERE name LIKE '%12%' OR id = 12;
注: cb.lower(root.get("name"))
を追加しました およびtext.toLowerCase()
大文字と小文字を区別しないようにするために、名前で検索する場合の部分に。