繁体   English   中英

如何使用 JPA 原生查询 select 多个同名列?

[英]How to select multiple columns with the same name using JPA native query?

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

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

(例如,给定记录的第一列描述的值是“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
            ..."

实体 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 和查询来创建本机查询。

entityManager.createNativeQuery(queryString, "DescricaoColumnAlias");

我认为您应该使用SqlResultSetMapping来指定列 map 到实体属性的方式。

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

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

select b.descricao AS d1, prd.descricao as d2, ca.descricao as d3...
@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();

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM