将 SQL(不是 JPQL)映射到简单 Java 对象的集合?

Posted

技术标签:

【中文标题】将 SQL(不是 JPQL)映射到简单 Java 对象的集合?【英文标题】:Map SQL (not JPQL) to a collection of simple Java objects? 【发布时间】:2011-10-14 05:01:52 【问题描述】:

我不敢相信我会问这个,但是......

在 Java 中,有什么方法可以执行 SQL 语句(不是 JPQL)并将结果映射到普通旧 Java 对象的 List

我希望能够创建小型轻量级 POJO 对象,然后用原始 SQL 查询填充它们。我明确希望创建复杂的对象:只是基元,没有关系。

一切似乎都以 JPA/JPQL 为中心,但问题是我不想将我的对象绑定到特定的表。

我觉得我要么是:

(a) 服用疯狂的药丸,或 (b) 缺少一些基本的东西

【问题讨论】:

【参考方案1】:

轻量级映射器不能作为 JDK 本身的一部分使用。您可以使用 Java 标准 JDBC API 滚动您自己的简单映射器(实际上 JPA​​ 实现建立在此之上),或者您可以查看提供简单 SQL 到对象映射器的外部库。我知道MyBatis(原名iBatis)。

A) 不,我认为您没有服用疯狂的药丸,B) 您是否可能只是错过了 JDBC?

【讨论】:

【参考方案2】:

Sormula 或许可以为所欲为。您需要扩展 Table 并覆盖 getTableName() 和/或 getQualifiedTableName() 以提供所需的表名,因为 sormula 通常将一个 POJO 关联到一个表。请参阅example 2a 和example 3a。

【讨论】:

从 1.2 版开始,您不再需要继承来完成此操作。只需使用 Table setTableName 方法。【参考方案3】:

jOOQ 有几个 Record -> POJO 映射功能可能会为您完成这项工作(尽管 jOOQ 可以做得更多)。这是一个例子:

// A "mutable" POJO class
public class MyBook1 
  public int id;
  public String title;


// The various "into()" methods allow for fetching records into your POJOs:
List<MyBook1> myBooks = create.select().from(BOOK).fetchInto(MyBook1.class);

摘自此处的手册: http://www.jooq.org/doc/latest/manual/sql-execution/fetching/pojos/

Javadoc 中描述了映射算法: http://www.jooq.org/javadoc/latest/org/jooq/impl/DefaultRecordMapper.html

虽然上面的示例使用了 jOOQ 的 DSL API,但您也可以使用纯 SQL:

List<MyBook1> myBooks = create.resultQuery("SELECT * FROM BOOK")
                              .fetchInto(MyBook1.class);

您甚至可以对 JDBC ResultSet 进行操作,只使用 jOOQ 进行映射:

ResultSet rs = stmt.executeQuery();
List<MyBook1> myBooks = create.fetch(rs).into(MyBook1.class);

【讨论】:

以上是关于将 SQL(不是 JPQL)映射到简单 Java 对象的集合?的主要内容,如果未能解决你的问题,请参考以下文章

JPA JPQL简介

javaee 第11周

JPQL 的 Spring Boot JPA“查询验证失败”错误

EclipseLink 拒绝将 PostgreSQL 上的本机查询映射到实体

JPQL IN 子句:Java 数组(或列表、集合...)?

jpql sql在同一个事务中