Java 使用模型API创建普通JOOQ SQL查询

Java 使用模型API创建普通JOOQ SQL查询,java,sql,dsl,jooq,Java,Sql,Dsl,Jooq,我一直在使用JOOQ,它似乎是生成SQL查询的一个非常有用的库。但是,我一直在动态生成它们。例如,下面是我想做的事情(注意,我只想使用它进行SQL构建,而不生成任何代码) 如果.where、.orderBy可以接受null,并且如果这些子句为null,则不会将它们添加到SQL中,那么上面的一个可能会很有用,但这似乎是不可能的 以下是我的问题: 有没有一种方法可以动态创建一个选择查询,然后在不使用任何代码生成的情况下对其进行验证,因为我的用例只涉及构造一个纯字符串SQL?这个答案:似乎不再有效,因

我一直在使用JOOQ,它似乎是生成SQL查询的一个非常有用的库。但是,我一直在动态生成它们。例如,下面是我想做的事情(注意,我只想使用它进行SQL构建,而不生成任何代码)

如果.where、.orderBy可以接受null,并且如果这些子句为null,则不会将它们添加到SQL中,那么上面的一个可能会很有用,但这似乎是不可能的

以下是我的问题:

有没有一种方法可以动态创建一个选择查询,然后在不使用任何代码生成的情况下对其进行验证,因为我的用例只涉及构造一个纯字符串SQL?这个答案:似乎不再有效,因为我在3.6.x中没有找到工厂方法,对于这种用例,什么是最好的方法

虽然我可以通过设置值和执行.getSQL()来获取带有?的SQL,但还有另一个步骤可以获取绑定变量,以便将其传递给PreparedStatement,可以在一个步骤中完成吗


如何将其与JDBCTemplate集成?

首先,您将术语模型API放在问题标题中,但您没有使用模型API,而是使用DSL API,它更适合于“静态SQL查询”。因此,这将是一种更合适的API用法:

List query=create.selectQuery();
query.addFrom(表(名称(“表”));
如果(在哪里)
query.addWhere(条件…);
如果(分组)
query.addGroupBy(列表>…);
关于你的具体问题:

使用带有绑定变量的
getSQL()
事实上,在默认情况下,jOOQ总是在其SQL语句中生成绑定变量,这是大多数数据库性能方面更好的默认选择

如果您确实想要内联绑定变量,请使用。但是,您可能希望继续使用绑定变量,因此可以使用以下方法从查询中提取它们:

它与JDBCTemplate的工作方式相同。

“是否有一种方法可以动态创建选择查询”-对不起,我不确定您的意思。你在挣扎什么?/“我在3.6.x中找不到工厂方法”-你是对的,我将在那里编辑我的答案。
DSLContext context = DSL.using(SQLDialect.DEFAULT);

List<Field<?>> select = getSelect(String fields ...); // gets the selection fields
Select query = create.select(select)
      .from(name("table"));

if(where)
   query = query.addWhere(Conditions...);
if(groupBy)
   query = query.groupBy(List<Field<?>> ...);
if(orderBy)
   query = query.orderBy(List<Field<?>> ...);
query.select()
      .from(...)
      .where(...)
      .orderBy(...)
      .fetch();
String sql = query.getSQL();
List<Object> variables = query.getBindVariables();
static List<Object[]> nativeQuery(EntityManager em, org.jooq.Query query) {

    // Extract the SQL statement from the jOOQ query:
    Query result = em.createNativeQuery(query.getSQL());

    // Extract the bind values from the jOOQ query:
    List<Object> values = query.getBindValues();
    for (int i = 0; i < values.size(); i++) {
        result.setParameter(i + 1, values.get(i));
    }

    return result.getResultList();
}