如何使用JPA本机查询选择具有相同名称的多个列?

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

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

(例如,当我在一个对象数组中得到这个结果时,给定记录的第一列descricao的值是“foo”,第二个“bar”和第三个“foobar”(因为我没有ORM映射到实体),无论在哪里填充给定的第二和第三列descricao的值都填充第一个的值)

我很确定这是因为我曾经使用过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和query来创建本机查询。

 entityManager.createNativeQuery(queryString, "DescricaoColumnAlias"); 

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

您可能会发现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 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(); }