sql >> データベース >  >> RDS >> Mysql

JPA検索文字列、ロングおよびブール

    仕様

    仕様を使用して、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() 大文字と小文字を区別しないようにするために、名前で検索する場合の部分に。




    1. (アドバイスが必要)AndroidアプリからMySQLサーバーデータベースに話しかける

    2. 直接関数を使用せずに数値を単語で表示するSQLステートメント(oracle)

    3. MySQLではUNIQUEインデックスで大文字と小文字が区別されますか?

    4. symfonyクエリのエラー:期待される文字通り、取得しました''