2016-12-19 9 views
-1

私はjavaで検索ツールを作った。JPAクエリのクエリビルダ?

これらparameretsのすべてが値を持っている場合は、これを出力リレー
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 + "' "; 

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に "where"を追加するのが難しくなります。ネイティブによる

:JPQLことで

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

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

ありがとうございました! –