将 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 对象的集合?的主要内容,如果未能解决你的问题,请参考以下文章
JPQL 的 Spring Boot JPA“查询验证失败”错误
EclipseLink 拒绝将 PostgreSQL 上的本机查询映射到实体