【问题标题】:QueryDSL request with parameters, is it possible?查询带参数的DSL请求,可以吗?
【发布时间】:2016-08-15 11:32:37
【问题描述】:

在 SQL 中,使用字符串连接进行参数化查询非常简单。例如,我根据预设参数(带有列名的字符串)从数据库表中获取必要的列

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

在这个查询中,我得到了整个表。

【问题讨论】:

  • 您连接字符串以构建查询的示例非常糟糕。 PreparedStatement 是避免 SQL 注入的方法。
  • @kayaman 我可以在 QueryDSL 中使用 PreparedStatement 吗?
  • @Kayaman ,我已经阅读了很多文档,但我仍然没有找到如何根据我的 JSON 参数选择任意表和列,例如我的前端。如果您与我分享这些能力描述的链接,这将非常有帮助。
  • 听起来 QueryDSL 有一些糟糕的文档。考虑到 QueryDSL 是为“选择任意表和列”而构建的,奇怪的是他们的文档没有提到它。
  • @Kayaman 好的,谢谢,你能给个链接吗?

标签: java sql postgresql querydsl


【解决方案1】:

终于,我找到了答案。解决方案位于此页面: 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;
    });
 }
}

【讨论】:

  • 这根本不能回答问题,你不是在使用 Querydsl 而是在构建一个原生查询!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2018-10-15
  • 2023-04-02
  • 2016-08-26
  • 2013-05-30
  • 2021-03-30
  • 1970-01-01
相关资源
最近更新 更多