如何使用 JPA 原生查询选择多个同名的列?

Posted

技术标签:

【中文标题】如何使用 JPA 原生查询选择多个同名的列?【英文标题】:How to select multiple columns with the same name using JPA native query? 【发布时间】:2011-09-05 00:44:59 【问题描述】:

我在通过 JPA 使用 sql 本机查询选择一些数据时遇到了一些麻烦。那是因为我有 3 列同名“descricao”。

当我通过 EntityManager 接口的 createNativeQuery 方法执行选择操作时,找到的第一列值会覆盖其他列值。

(例如,给定记录的第一列描述的值是“foo”,第二个“bar”和第三个“foobar”,当我在一个对象数组中得到这个结果时(因为我没有ORM 映射了实体),任何地方都应该用给定的列的第二个和第三个值来填充 descicao 用第一个的值填充)

我很确定这是因为我使用过 JPA,一旦直接在数据库上选择会正确返回所有内容。

环境:

mysql5; EJB 3.0; JPA 1.0; JBoss 5.0.0GA; JDK 1.6;

SQL 查询:

"select p.id, p.datapedido, b.descricao, prd.descricao, s.nome,
            usuario.email, cc.chave_cupom, prd.nome,
             ca.descricao, i.produto_id, i.valoritem,
             hc.valor_utilizado, tp.datapagamento
            ..."

【问题讨论】:

【参考方案1】:

我认为您应该使用SqlResultSetMapping 来指定列如何映射到实体的属性。

您可能会发现这个 Eclipselink 项目(JPA 参考实现)的 wiki 页面很有用:http://en.wikibooks.org/wiki/Java_Persistence/Querying#Result_Set_Mapping

【讨论】:

针对非常具体的问题的(非常通用的)文档的链接没有用恕我直言。至少引用相关部分,以便我们知道我们应该查看文档的哪一部分。【参考方案2】:

我不使用 JPA,所以如果不符合要求则忽略,但如果实体未映射,那么为什么不能在查询中为受影响的字段设置别名并相应地访问结果集?

select b.descricao AS d1, prd.descricao as d2, ca.descricao as d3...

【讨论】:

【参考方案3】:

实体 Bean 中的标量列映射:

@SqlResultSetMapping(
      name="DescricaoColumnAlias",
      columns=@ColumnResult(name="B_DESCRICAO"),
               @ColumnResult(name="CA_DESCRICAO"),
               @ColumnResult(name="PRD_DESCRICAO")
)

现在使用列映射中指定的本机查询中的列的别名。

"选择 p.id, p.datapedido, b.descricao 作为 B_DESCRICAO, prd.descricao 作为 PRD_DESCRICAO, s.nome, usuario.email, cc.chave_cupom, prd.nome, ca.descricao 作为 CA_DESCRICAO, i.produto_id , i.valoritem, hc.valor_utilizado, tp.datapagamento..."

通过指定 resultSetMapping & query 创建原生查询。

entityManager.createNativeQuery(queryString, "DescricaoColumnAlias");

【讨论】:

@Nayan 从我看到的只有您在映射中指定的列从本机查询返回,您的示例是如何工作的?【参考方案4】:
@Transactional(readOnly = true)
@SuppressWarnings("unchecked")
@Column(name = "status")

public List<Student> findStudentByStatus(String status) 
    System.out
            .println("call findStudentMethd******************with this pattern"
                    + status
                    + "*********************************************");

    return em.createQuery(
            "select attendence from Attendence attendence where attendence.status like '"
                    + p
                    + A 
                    + L 
                    + "'")

    .getResultList();


【讨论】:

以上是关于如何使用 JPA 原生查询选择多个同名的列?的主要内容,如果未能解决你的问题,请参考以下文章

使用 JPA 原生查询时是不是必须选择所有实体属性?

如何使用同名的多个复选框自定义查询字符串?

JPA:如何将原生查询结果集转换为 POJO 类集合

如何在单个 JDBC 连接中执行多个 JPA 查询

如何在JAVA JPA Spring Boot中的一个SQL查询中选择多个数据

JPA 原生查询