2016-12-19 3 views
-1

Я создал инструмент поиска в java.sql Query builder в запросе JPA?

String query = "SELECT * FROM Customer WHERE 1 = 1 "; 
     if (!firstname.isEmpty()) query += "AND cName = '"  + firstname  + "' "; 
     if (!lastname.isEmpty()) query += "AND cLastName = '" + lastname  + "' "; 
     if (!epost.isEmpty())  query += "AND cEpost = '"  + epost   + "' "; 
     if (!phonenumber.isEmpty()) query += "AND cPhonenumber '" + phonenumber + "' "; 

Это Ouput это, если все эти paramerets имеет значения:

SELECT * FROM Customer WHERE 1 = 1 
AND cName = 'test' 
AND cLastName = 'test1' 
AND cEpost = 'test2' 
AND cPhonenumber 'test3' 

Это так, как я могу получить лучшие результаты путем заполнения дополнительных данных, но я все еще могу выбрать, чтобы не делать .. мне нужно решение для JPA для этого .. любые советы?

Спасибо!

EDIT: Конечный результат на основе ответа ниже:

public static List<Customer> searchCustomersByParameters(String firstname, String lastname, 
    String epost, String phonenumber) { 

    String sql = "SELECT c FROM Customer c WHERE 1 = 1 "; 
    if (!firstname.isEmpty()) sql += "AND c.cName = :firstname "; 
    if (!lastname.isEmpty()) sql += "AND c.cLastName = :lastname "; 
    if (!epost.isEmpty())  sql += "AND c.cEpost = :epost "; 
    if (!phonenumber.isEmpty()) sql += "AND c.cPhonenumber = :phonenumber"; 

    Query q = em.createQuery(sql); 
    if (!firstname.isEmpty()) q.setParameter("firstname", firstname); 
    if (!lastname.isEmpty()) q.setParameter("lastname", lastname); 
    if (!epost.isEmpty())  q.setParameter("epost", epost); 
    if (!phonenumber.isEmpty()) q.setParameter("phonenumber", phonenumber); 

    return q.getResultList(); 


} 
+6

Примечание стороны: вы не должны делать это так: Если только один из параметров не правильно спасся, [каждый может выполнить произвольный код SQL] (https://en.wikipedia.org/wiki/SQL_injection). Используйте '?' В качестве заполнителей при построении запроса, а затем используйте подготовленные инструкции для автоматического выхода из всех параметров. – BackSlash

+0

Да, я знаю. Но это должно было привести пример :-) Спасибо! –

ответ

2

использования? и задайте параметры для предотвращения внедрения sql и в JPA вы можете использовать собственный sql как старый способ, а также JPQL. Создайте свой sql по условиям и задайте свои параметры. Я использую здесь, где 1 = 1 условие для легкого добавления следующих условий и. В противном случае у вас возникнут трудности с добавлением «где» к вашему sql.

уроженцем:

public static List<YourEntity> getFromTable(String name,String surname) { 
     EntityManager em = PersistenceManager.instance().createEntityManager(); 

     try { 
      String sql = " select * from table where 1=1 "; 
      if(name!=null && !name.trim().isEmpty()){ 
       sql +=" and name = :name"; 
      } 
      if(surname!=null && !surname.trim().isEmpty()){ 
       sql +=" and surname = :surname"; 
      } 

      Query q = em.createNativeQuery(sql); 
      if(name!=null && !name.trim().isEmpty()){ 
       q.setParameter("name", name); 
      } 
      if(surname!=null && !surname.trim().isEmpty()){ 
       q.setParameter("surname", surname); 
      } 

      List<YourEntity> l = q.getResultList(); 
      return l; 
     } finally { 
      em.close(); 
     } 
    } 

По jpql:

public static List<YourEntity> getFromTable(String name,String surname) { 
     EntityManager em = PersistenceManager.instance().createEntityManager(); 

     try { 
      String sql = " select e from YourEntity e where 1=1 "; 
      if(name!=null && !name.trim().isEmpty()){ 
       sql +=" and e.name = :name"; 
      } 
      if(surname!=null && !surname.trim().isEmpty()){ 
       sql +=" and e.surname = :surname"; 
      } 

      Query q = em.createQuery(sql); 
      if(name!=null && !name.trim().isEmpty()){ 
       q.setParameter("name", name); 
      } 
      if(surname!=null && !surname.trim().isEmpty()){ 
       q.setParameter("surname", surname); 
      } 

      List<YourEntity> l = q.getResultList(); 
      return l; 
     } finally { 
      em.close(); 
     } 
    } 
+0

Большое спасибо! –