如何在唯一的映射或非对象 JPA 中返回多个结果

Posted

技术标签:

【中文标题】如何在唯一的映射或非对象 JPA 中返回多个结果【英文标题】:How to return multiple results in a unique mapped or not object JPA 【发布时间】:2015-05-07 20:36:14 【问题描述】:

org.hibernate 休眠核心 4.3.8.决赛 org.hibernate 休眠实体管理器 4.3.8.决赛 我的 pom.xml

我的问题是:如何进行这样的查询...

 SELECT
    TABLE_D.*,
    TABLE_A.NAME_A

FROM
    TABLE_D
INNER JOIN
    TABLE_E
        ON TABLE_D.ID_TAB_E  = TABLE_D.ID_TAB_D
LEFT JOIN
    TABLE_C 
        ON TABLE_C.ID_TAB_C  = TABLE_D.ID_TAB_D
INNER JOIN
    TABLE_B
        ON TABLE_B.ID_TAB_B  = TABLE_C.ID_TAB_C
INNER JOIN
    TABLE_A
        ON TABLE_A.ID_TAB_A  = TABLE_B.ID_TAB_B
WHERE
    TABLE_A.NAME_A = "XXXX";

并在 JPA 中返回唯一对象列表中的选定值 TABLE_D 和 TABLE_A(例如:我创建的对象以获取所有这些字段)(我可以创建 1 个过滤器,无论如何...)?请帮忙。

【问题讨论】:

显示你的实体类 它们太大了,但我只需要一节课就可以拿到这些文件。当我使用 getConnection().createNativeQuery(sql.toString(), Table_D.class) 时,它只返回 TABLE_D 字段和您的 fk 实体 TABLE_E 和 TABLE_C。所以我看不懂 TABLE_B 和 A。 【参考方案1】:

如果您需要在 HQL 中返回选定列的列表,您可以编写您的 hql 查询并返回一个对象数组列表,即:

List<Object[]> result = session.createQuery("select a.field1, b.field2 from EntityA a join a.entityB b").list();

然后您可以根据它们的类型(即字符串)迭代并获取值:

for (Object[] arr : result) 
    String col1 = (String)arr[0];
    String col2 = (String)arr[1];

【讨论】:

我可以使用与 createNativeQuery() 相同的 ideia 吗? 是的,只是列类型在 createQuery 和 createNativeQuery 中可能不同,即在进行强制转换时,它可能是 BigInteger 而不是 Integer。但是你没有理由使用原生 SQL,因为你的查询完全被 hql 和 jpql 支持......

以上是关于如何在唯一的映射或非对象 JPA 中返回多个结果的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉 JPA CriteriaBuilder 按返回的唯一数据列排序?

将 MySql 视图映射到 JPA 实体,使用哪个唯一 ID?

如何调用 Spring JPA 函数并在对象中返回结果

处理来自 JPA/DAO 实体的结果中的非 DB 映射字段

使用 Spring JPA 调用存储过程

两个不同的查询返回相同的对象 Spring Boot JPA