sql >> Database >  >> RDS >> Mysql

JPA-zoekreeks, lang en booleaans

Heb je het gebruik van Specificaties ?

Met behulp van specificaties kunt u dynamisch de WHERE . genereren onderdeel van een lentegegevensquery. Om specificaties te gebruiken met uw lentegegevens JPA-query's, moet u de org.springframework.data.jpa.repository.JpaSpecificationExecutor uitbreiden koppel. Uw gebruikersrepository kan er dus als volgt uitzien:

public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}

Uw zoekmethode zou er zo uit kunnen zien

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);

}

Eerst beginnen we met het toevoegen van de name LIKE %text% deel van de waar-uitdrukking.

Vervolgens controleren we of de waarde van de text variabele kan worden gecast naar long . Als het kan, halen we de lange waarde uit de tekenreeks en voegen deze toe aan de waar-query.

Als laatste controleren we of de text variabele kan naar boolean worden gecast. Als het kan, voegen we die controle ook toe aan de vraag.

Als bijvoorbeeld de waarde van de text variabele is test1 het waar-gedeelte zal zijn

WHERE name LIKE '%test1%;

Als de waarde van de text variabele is waar dan zal het waar-gedeelte zijn

WHERE name LIKE '%true%' OR is_active = true;

Ten slotte, als de waarde van de text variabele is 12 dan zal het waar-gedeelte zijn

WHERE name LIKE '%12%' OR id = 12;

Opmerking: Ik heb cb.lower(root.get("name")) . toegevoegd en text.toLowerCase() naar het gedeelte wanneer we op naam zoeken om de zoekopdracht hoofdletterongevoelig te maken.




  1. Converteren tussen SQL char en C#

  2. Word lid van 2 tafels en geef ze weer op id, prioriteit en nummer

  3. De Oracle-instantie afsluiten en starten

  4. Queryresultaten retourneren als een door komma's gescheiden lijst in PostgreSQL