2016-08-15 2 views
1

В SQL очень просто сделать параметризованный запрос, используя конкатенацию строк. Пример, где я получаю необходимые столбцы из таблицы БД в соответствии заданных параметров (строки с именами столбцов)Запрос QueryDSL с параметрами, возможно ли это?

String id_column = "id", city_column = "city", streetname_column ="streetname", housenumber_column = "housenumber"; //Parameters 
     stmt = c.createStatement(); 
     ResultSet rs = stmt.executeQuery("SELECT "+id_column+","+streetname_column+" FROM address"); //How do the same in QueryDSL? 
     ResultSetMetaData rsmd = rs.getMetaData(); 
     for (int i = 0; i < rsmd.getColumnCount(); i++){ 
      System.out.print(rsmd.getColumnName(i+1)+" "); 
     } 
     while (rs.next()) { 
      System.out.print("\n"); 
      for (int i = 0; i < rsmd.getColumnCount(); i++){ 
       System.out.print(
         rs.getString(rsmd.getColumnName(i+1)) + " " 
       ); 
      } 
     } 

Как я могу сделать то же самое с этим (вы также можете сделать свой собственный пример) запрос QueryDSL:

List<Address> q1=queryFactory.selectFrom(address) 
        .fetch(); 

В этом вопросе я получаю целую таблицу.

+1

Ваш пример конкатенации строк, чтобы создать запрос действительно плохо. 'PreparedStatement' - это способ избежать SQL-инъекции. – Kayaman

+0

@kayaman и могу ли я сделать 'PreparedStatement' в QueryDSL? –

+0

Звучит так, будто вы не читали никакой документации. – Kayaman

ответ

0

Наконец-то я нашел ответ. Решение находится на этой странице: Examples of using play.db.jpa.JPAApi

И в контексте моего вопроса, решение заключается в следующем:

package controllers; 
import play.db.jpa.JPAApi; 
import play.db.jpa.Transactional; 
import javax.inject.Inject; 
import javax.persistence.Query; 
import java.util.ArrayList; 
import java.util.List; 

public class TestingReportsDep{ 

private JPAApi jpaApi; 
@Inject 
public TestingReportsDep(JPAApi jpaApi) { 
    this.jpaApi = jpaApi; 
} 
Object[] tempObj; 

@Transactional 
public void resolving_requests) { 
    String id_column = "id", city_column = "city", streetname_column ="streetname", housenumber_column = "housenumber"; //Parameters 
    String request="SELECT "+id_column+","+streetname_column+" FROM address;"; 
    jpaApi.withTransaction(entityManager -> { 
     Query query = entityManager.createNativeQuery(request); 
     int ResultsAmount = query.getResultList().size(); 
     List Result = query.getResultList(); 
     System.out.print("\n\n\nNew super query by Bogdan:\n"); 

     for(int i=0; i< ResultsAmount; i++){ 
      tempObj = (Object[]) Result.get(i); 

      System.out.print(tempObj[0]+" "+tempObj[1]+"\n"); 
     } 
     return null; 
    }); 
} 
}