Как выбрать несколько столбцов с тем же именем, используя собственный запрос JPA?

У меня возникли некоторые проблемы при выборе некоторых данных с помощью SQL native query через JPA. Это потому что у меня есть 3 столбца с тем же именем, "descricao".

когда я выполняю операцию select через createNativeQuery метод EntityManager interface первое найденное значение столбца переопределяет другие.

(напр. значение первого столбца descricao данной записи - "foo", второго " bar " и третьего "foobar", когда я получаю этот результат в массиве объектов (потому что я не ORM сопоставил объекты), где должны быть заполнены заданные второе и третье значения столбца descricao заполняются значением первого)

Я совершенно уверен, что это потому, что я использовал JPA после выбора непосредственно в базе данных, возвращаю все правильно.

среда:

MySQL5; EJB 3.0 в; В JPA 1.0; С JBoss 5.0.0 га; версия 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 ответов


скалярные сопоставления столбцов в Entity 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, С. Ноум, пользователь.электронной почты, чч.chave_cupom, prd.ном, Калифорния.descricao как CA_DESCRICAO, i.produto_id, i.valoritem, hc.valor_utilizado, tp.датапагаменто..."

создание собственного запроса путем указания resultSetMapping & запрос.

entityManager.createNativeQuery(queryString, "DescricaoColumnAlias");

Я думаю, вы должны использовать SqlResultSetMapping чтобы указать, как столбцы сопоставляются со свойствами объектов.

вы можете найти эту вики-страницу проекта Eclipselink (JPA reference implementation) полезной: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<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();

}