Java 如何使用JPA本机查询选择多个同名列?

Java 如何使用JPA本机查询选择多个同名列?,java,mysql,jpa,jdbc,Java,Mysql,Jpa,Jdbc,我在通过JPA使用sql本机查询选择一些数据时遇到了一些问题。这是因为我有3列同名“descripao” 当我通过EntityManager接口的createNativeQuery方法执行select操作时,找到的第一列值将覆盖其他列值 (例如,当我在一个对象数组中得到这个结果时(因为我没有ORM映射实体),给定记录的第一列描述符的值是“foo”,第二列描述符的值是“bar”,第三列描述符的值是第一列描述符的值) 我很确定这是因为我曾经使用过JPA,直接在数据库中选择并正确返回所有内容 环境:

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

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

(例如,当我在一个对象数组中得到这个结果时(因为我没有ORM映射实体),给定记录的第一列描述符的值是“foo”,第二列描述符的值是“bar”,第三列描述符的值是第一列描述符的值)

我很确定这是因为我曾经使用过JPA,直接在数据库中选择并正确返回所有内容

环境:

"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
            ..."
MySQL5; ejb3.0; jpa1.0; JBoss5.0.0GA; jdk1.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
            ..."
我认为您应该使用来指定列如何映射到实体的属性


您可能会发现Eclipselink项目(JPA参考实现)的这个wiki页面很有用:

我不使用JPA,所以如果不正确,请忽略,但是如果实体没有映射,那么为什么您不能在查询中为受影响的字段添加别名并相应地访问结果集呢

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

实体Bean中的标量列映射:

@SqlResultSetMapping(
      name="DescricaoColumnAlias",
      columns={@ColumnResult(name="B_DESCRICAO"),
               @ColumnResult(name="CA_DESCRICAO"),
               @ColumnResult(name="PRD_DESCRICAO")}
)
现在为本机查询中的列使用别名,如列映射中指定的

“选择p.id、p.datapedido、b.descripcao作为b_descripcao、prd.descripcao作为prd_descripcao、s.nome、usuario.email、cc.chave_cupom、prd.nome、ca.descripcao作为ca_descripcao、i.produto_id、i.valoritem、hc.valor_utilizado、tp.datapagamento…””

通过指定ResultsMapping&query创建本机查询

entityManager.createNativeQuery(queryString, "DescricaoColumnAlias");
@Transactional(readOnly=true)
@抑制警告(“未选中”)
@列(name=“status”)
公共列表findStudentByStatus(字符串状态){
系统输出
.println(“使用此模式调用FindStudentMethod**************”
+地位
+ "*********************************************");
返回em.createQuery(
“从Attendance Attendance中选择Attendance,其中Attendance.status类似”
+p
+A
+L
+ "'")
.getResultList();
}

@Nayan从本机查询返回的映射中,我只看到了您指定的列,您的示例是如何工作的?对于非常具体的问题,指向(非常通用的)文档的链接在imho中没有用处。至少引用相关章节,以便我们知道应该查看文档的哪一部分。