Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wyszukiwanie JPA String, Long i Boolean

Czy rozważałeś użycie Specyfikacje ?

Korzystając ze specyfikacji, możesz dynamicznie generować WHERE część zapytania dotyczącego danych wiosennych. Aby użyć specyfikacji w zapytaniach JPA dotyczących danych wiosennych, musisz rozszerzyć org.springframework.data.jpa.repository.JpaSpecificationExecutor interfejs. Twoje repozytorium użytkowników może wyglądać tak:

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

Twoja metoda wyszukiwania może wyglądać tak

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

}

Najpierw zaczynamy od dodania name LIKE %text% część wyrażenia where.

Następnie sprawdzamy, czy wartość text zmienna może być rzutowana na long . Jeśli to możliwe, pobieramy długą wartość z ciągu i dodajemy ją do zapytania where.

Na koniec sprawdzamy, czy text zmienna może być rzutowana na wartość logiczną. Jeśli to możliwe, dodajemy również ten czek do zapytania.

Na przykład, jeśli wartość text zmienna to test1 gdzie będzie część

WHERE name LIKE '%test1%;

Jeśli wartość text zmienna jest prawda to gdzie będzie część

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

Wreszcie, jeśli wartość text zmienna to 12 to gdzie będzie część

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

Uwaga: Dodałem cb.lower(root.get("name")) i text.toLowerCase() do części, w której szukamy według nazwy, aby nie uwzględniać wielkości liter.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Łatwiejsza konfiguracja do pisania do MySQL na OSX z Pythonem

  2. Jak przeszukiwać tablicę JSON w MySQL?

  3. Jak uciec przed przecinkami wewnątrz wartości CSV podczas importowania tabeli do MySQL?

  4. Jak ponownie zaktualizować kolumnę id, zaczynając od 1?

  5. Wyzwalacz do śledzenia zmian w bazie danych MySQL