【问题标题】:How to select multiple columns with the same name using JPA native query?如何使用 JPA 原生查询选择多个同名的列?
【发布时间】: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
            ..."

【问题讨论】:

    标签: java mysql jpa jdbc


    【解决方案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();
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-30
        • 2017-11-21
        • 2018-11-13
        • 2011-08-31
        • 2012-04-22
        • 1970-01-01
        • 2017-01-23
        • 1970-01-01
        相关资源
        最近更新 更多