Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

String pencarian JPA, Panjang dan Boolean

Sudahkah Anda mempertimbangkan penggunaan Spesifikasi ?

Dengan menggunakan spesifikasi, Anda dapat secara dinamis menghasilkan WHERE bagian dari kueri data pegas. Untuk menggunakan spesifikasi dengan kueri JPA data pegas, Anda harus memperluas org.springframework.data.jpa.repository.JpaSpecificationExecutor antarmuka. Jadi repositori pengguna Anda akan terlihat seperti ini:

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

Metode pencarian Anda bisa terlihat seperti ini

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

}

Pertama kita mulai dengan menambahkan name LIKE %text% bagian dari ekspresi where.

Selanjutnya, kita periksa apakah nilai dari text variabel dapat dilemparkan ke long . Jika bisa, maka kita mendapatkan nilai panjang dari string dan menambahkannya ke kueri where.

Terakhir kita periksa apakah text variabel dapat dilemparkan ke boolean. Jika bisa, kami juga menambahkan tanda centang itu ke kueri.

Misalnya, jika nilai text variabelnya adalah test1 bagian mananya

WHERE name LIKE '%test1%;

Jika nilai text variabel benar lalu bagian mananya

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

Terakhir, jika nilai text variabelnya adalah 12 lalu bagian mananya

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

Catatan: Saya menambahkan cb.lower(root.get("name")) dan text.toLowerCase() ke bagian ketika kami mencari berdasarkan nama untuk membuat kasus pencarian tidak sensitif.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL pilih 3 baris terakhir, pesan berdasarkan ASC

  2. Django ORM query GROUP BY beberapa kolom digabungkan dengan MAX

  3. Google Data Studio - Cloud SQL Untuk Kesalahan Konektor MySQL

  4. Menggunakan Variabel SESI PHP untuk menyimpan hasil kueri MySQL

  5. Bagaimana cara mengoptimalkan kueri MySQL dengan konstanta?