org.jooq.Query.getBindValues() 返回的 List<Object> 是不是包含类型安全的对象 - 对于每个查询参数?

Posted

技术标签:

【中文标题】org.jooq.Query.getBindValues() 返回的 List<Object> 是不是包含类型安全的对象 - 对于每个查询参数?【英文标题】:Does the List<Object> returned by org.jooq.Query.getBindValues() contain type-safe objects - for each query parameter?org.jooq.Query.getBindValues() 返回的 List<Object> 是否包含类型安全的对象 - 对于每个查询参数? 【发布时间】:2020-06-08 08:41:07 【问题描述】:

JOOQ 的新手。 偶然发现了这个帖子: https://thoughts-on-java.org/hibernate-jooq-a-match-made-in-heaven/

`

SelectConditionStep<Record3<String, String, String>> jooqQuery = 
        ctx.select(AUTHOR.FIRSTNAME, AUTHOR.LASTNAME, BOOK.TITLE)
            .from(AUTHOR)
                .leftJoin(BOOK_AUTHOR).on(AUTHOR.ID.eq(BOOK_AUTHOR.AUTHORS_ID))
                .leftJoin(BOOK).on(BOOK_AUTHOR.BOOKS_ID.eq(BOOK.ID))
            .where(AUTHOR.FIRSTNAME.like("Thor%"));
Query q = em.createNativeQuery(jooqQuery.getSQL());
setBindParameterValues(q, jooqQuery);


private static void setBindParameterValues(javax.persistence.Query jpaQuery, org.jooq.Query jooqQuery) 
    List<Object> values = jooqQuery.getBindValues();
    for (int i = 0; i < values.size(); i++) 
        jpaQuery.setParameter(i + 1, values.get(i));
    

`

jpaQuery.setParameter() 方法本身不是类型安全的,因为它接受“对象”。

问题:jooqQuery.getBindValues() 是否返回 List&lt;Object&gt;,它们是“每个参数的类型安全”?

【问题讨论】:

【参考方案1】:

该方法是博文作者编写的用于将 jOOQ Query 转换为 JPA Query 的粘合代码。此胶水代码中没有类型安全性。您正在寻找的类型安全性在帖子的其他示例中提供,作者使用 jOOQ API 构建了类型安全查询,例如:

// This stuff is type safe
var jooqQuery = 
        ctx.select(AUTHOR.FIRSTNAME, AUTHOR.LASTNAME, BOOK.TITLE)
            .from(AUTHOR)
                .leftJoin(BOOK_AUTHOR).on(AUTHOR.ID.eq(BOOK_AUTHOR.AUTHORS_ID))
                .leftJoin(BOOK).on(BOOK_AUTHOR.BOOKS_ID.eq(BOOK.ID))
            .where(AUTHOR.FIRSTNAME.like("Thor%"));

// This stuff isn't, and there is no need
Query q = em.createNativeQuery(jooqQuery.getSQL());
setBindParameterValues(q, jooqQuery);

【讨论】:

“这东西不是,也没有必要”——这是什么意思?我们现在不需要担心类型安全吗?通过 JOOQ DSLContext 构建 SQL 时是否小心? 我真的不知道你在这里问什么 谢谢,您已经在twitter 中回答了。并接受您的回答:"The type of the bind value will be printed, e.g. Integer, String, Date, etc."

以上是关于org.jooq.Query.getBindValues() 返回的 List<Object> 是不是包含类型安全的对象 - 对于每个查询参数?的主要内容,如果未能解决你的问题,请参考以下文章