2011-05-30 21 views
7

Tengo algunos problemas al seleccionar algunos datos mediante la consulta nativa sql a través de JPA. Eso es porque tengo 3 columnas con el mismo nombre, "descricao".¿Cómo seleccionar varias columnas con el mismo nombre usando la consulta nativa JPA?

Cuando ejecutar la operación de selección a través de la createNativeQuery método de la interfaz EntityManager el primer valor de la columna encontraron sustituciones de los otros.

(por ejemplo, el valor de la primera columna descricao del registro dado es "foo", la segunda "barra" y el tercero "foobar", cuando obtengo este resultado en una matriz de objetos (porque no tengo) t ORM mapeó las entidades), donde sea que deba llenarse con los valores segundo y tercero dados de la columna descricao se llenan con el valor de la primera)

Estoy seguro de que es porque he usado JPA una vez seleccionando directamente en la base de datos devuelve todo correctamente.

Medio Ambiente:

MySQL5; EJB 3.0; JPA 1.0; JBoss 5.0.0GA; JDK 1.6;

consulta 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 
      ..." 

Respuesta

5

Asignaciones de columnas escalares en bean de entidad:

@SqlResultSetMapping(
     name="DescricaoColumnAlias", 
     columns={@ColumnResult(name="B_DESCRICAO"), 
       @ColumnResult(name="CA_DESCRICAO"), 
       @ColumnResult(name="PRD_DESCRICAO")} 
) 

Ahora, utilizando alias para las columnas de la consulta nativa como se especifica en las correlaciones de columnas.

"seleccione p.id, p.datapedido, b.descricao como B_DESCRICAO, prd.descricao como PRD_DESCRICAO, s.nome, usuario.email, cc.chave_cupom, prd.nome, ca.descricao como CA_DESCRICAO, i. produto_id, i.valoritem, hc.valor_utilizado, tp.datapagamento ... "

Creación de consulta nativa especificando la consulta resultSetMapping &.

entityManager.createNativeQuery(queryString, "DescricaoColumnAlias"); 
+0

gracias, solución perfecta – Arun

+0

@Arun De nada. –

+0

@Nayan por lo que vi solo las columnas que especificó en el retorno de mapeo de la consulta nativa, ¿cómo funciona su ejemplo? –

1

creo que debería usar SqlResultSetMapping para especificar la forma en las columnas se asignan a las propiedades de las entidades.

Usted puede encontrar esta página wiki del proyecto EclipseLink (implementación de referencia APP) útil: http://en.wikibooks.org/wiki/Java_Persistence/Querying#Result_Set_Mapping

+0

Los enlaces a documentos (muy genérico) para preguntas muy específicas que no están en mi humilde opinión útil. Al menos cite la (s) sección (es) relevante (s) para que sepamos qué parte de los documentos deberíamos ver. –

0

No utilizar JPA, así que ignore si fuera de lugar, pero si las entidades no están asignados, entonces ¿por qué ¿No alias los campos afectados en su consulta y accede al conjunto de resultados en consecuencia?

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

} 
Cuestiones relacionadas