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

时间:2011-05-30 19:45:25

标签: java mysql jpa jdbc

我在使用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
            ..."

4 个答案:

答案 0 :(得分:5)

实体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");

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我不使用JPA,所以如果没有标记,请忽略,但如果实体未映射,那么为什么不能在查询中对受影响的字段进行别名并相应地访问结果集?

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

答案 3 :(得分:-1)

@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();

}