2016-03-18 5 views
-1

Из-за сложности моей базы данных я решил создать новый объект, где я указываю только параметры, которые я буду использовать. Для выполнения пользовательского запроса я использую createNativeQuery в JPA. После моего объекта.Вызвано: org.hibernate.MappingException: Неизвестный объект: Новый объект. JTA

POJO:

@Entity 
public class Unidade implements Serializable{ 

    private static final long serialVersionUID = 1L; 


    private Long numeroUnidade; 
    private String nomeUnidade; 
    private Integer numeroCep; 
    private Integer numeroCepComplemento; 
    private String tipoServico; 
    private Integer status; 
    private String logradouro; 
    private String bairro; 
    private String cidade; 
    private String uf; 
    private Integer statusVinculo; 

    //getter and setters 

В настоящее время я использую следующие выберите, чтобы вернуть простое число и работает без показа каких-либо проблем.

@PersistenceContext(unitName="projetoAtividade") 
private EntityManager em; 

public void selectTeste(){ 
     int quantidade = (Integer) em.createNativeQuery("select count(*) from abc.nattbu29_escritorio;").getSingleResult(); 
     System.out.println("========== QUANTIDADE DE REGISTRO NA TABELA ==========="); 
     System.out.println(quantidade); 
    } 

Хотя предыдущий запрос работал нормально, когда представить сложный запрос ввода соответствующего псевдонима, используя слишком createNativeQuery и положить возвращение объекта, то гибернация бросить исключение (org.hibernate.MappingException: неизвестно).

Вспоминая, что я создаю новый класс, определяющий @Entity.

Запрос:

@SuppressWarnings("unchecked") 
     public List<UnidadeTeste> buscarUnidadeGenerica(int numeroCeps, int numeroComplementoCeps){ 
      List<UnidadeTeste> lsita = new ArrayList<UnidadeTeste>(); 
      String query = "SELECT " 
        +"TBZ21.NATURAL as numeroPv, " 
        +"TBZ21.UNIDADE as nomePv, " 
        +"TBZ21.SITUACAO as statusVinculacao, " 
        +"TBJ55.TPO_ATUACAO_U44 as tipoServAZW, " 
        +"TBJ55.SITUACAO_ATUAL as status, " 
        +"TBH18.LOCALIDADE as cidade, " 
        +"'' as bairro, " 
        +"'' as logradouro, " 
        +"TBH18.CEP as numeroCep, " 
        +"TBH18.CEP_COMPLEMENTO as numeroCepComplemento, " 
        +"TBH18.FK_AZWVWL22_UNISG as uf " 
        +"FROM AZW.AZWTBJ55_RGATUACAO TBJ55 " 
        +"LEFT JOIN AZW.AZWTBH18_LOCALIDADE TBH18 ON " 
        +"TBH18.LOCALIDADEE = TBJ55.LOCALIDADEE " 
        +"LEFT JOIN AZW.AZWTBZ21_UNIDADE TBZ21 ON " 
        +"TBJ55.NATURAL = TBZ21.NATURAL " 
        +"WHERE TBH18.CEP = ?1 " 
         +"AND TBH18.CEP_COMPLEMENTO = ?2; " 

      lsita = em.createNativeQuery(query, Unidade.class) 
        .setParameter(1, numeroCeps) 
        .setParameter(2, numeroComplementoCeps) 
        .getResultList(); 
      System.out.println(lsita.size()+"<<<<====================="); 
      return lsita; 
     } 

Ошибка:

Caused by: org.hibernate.MappingException: Unknown entity: br.com.project.modelo.UnidadeTeste 
    at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:1031) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.getSQLLoadable(SQLQueryReturnProcessor.java:336) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processRootReturn(SQLQueryReturnProcessor.java:377) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processReturn(SQLQueryReturnProcessor.java:356) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.process(SQLQueryReturnProcessor.java:172) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
    at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:87) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
    at org.hibernate.engine.query.spi.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:67) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
    at org.hibernate.engine.query.spi.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:155) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
    at org.hibernate.internal.AbstractSessionImpl.getNativeSQLQueryPlan(AbstractSessionImpl.java:218) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
    at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:224) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
    at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:156) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:252) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final] 
    ... 84 more 

В моем поиске через Интернет, почти все темы на форуме было единодушным в ответ решение: «Переключите @Entity перед классом декларации», но , это не работает для меня.

Я все время проводил поиски решений, но, к сожалению, У меня не было успехов. Кто-то может сказать новый способ решить мою проблему? Я тестировал в 2 разных проектах и ​​делал ту же проблему.

Вопрос комплемента:

Folks, я попытался создать @SqlResultSetMapping в моем классе, кодирование следующее, но теперь, в Hibernate trows Другое исключение:

ERROR [org.jboss.ejb3.invocation] (http--127.0.0.1-8888-2) JBAS014134: EJB Invocation failed on component AtividadeEJB for method public void br.com.project.jboss.modelo.AtividadeEJB.testeChamada(): javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.MappingException: Unknown SqlResultSetMapping [UnidadeResult] 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:166) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:230) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:304) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:190) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] 

Мой новый POJO:

@Entity 
@SqlResultSetMapping(name="UnidadeResult", 
entities={ 
    @EntityResult(entityClass=UnidadeTeste.class, fields={ 
     @FieldResult(name="tx_descricao", column="nomePv"), 
     @FieldResult(name="nu_idntr_pessoa", column="id")})}, 
columns={ 
    @ColumnResult(name="nomePv")} 
) 


public class UnidadeTeste implements Serializable{ 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue 
    private Long id; 

    private String nomePv; 

    public String getNomePv() { 
     return nomePv; 
    } 

    public void setNomePv(String nomePv) { 
     this.nomePv = nomePv; 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

Мой EJB:

@SuppressWarnings("unchecked") 
    public void testeChamada(){ 
     List<Object> lista = em.createNativeQuery("SELECT nu_idntr_pessoa as id, email as nomePv FROM pessoa;", "UnidadeResult").getResultList(); 
     System.out.println("===============>>"+lista.size()); 
    } 
+0

Можете ли вы проверить свой класс сущностей, что вы импортировали 'javax.persistence.Entity' вместо' org.hibernate.annotations.Entity', и вы сделали JPA осведомленным об этом сущности через тег сопоставления 'persistence.xml'? или 'component-scan' и т. д. –

+0

Итак, я использую только javax.persistence.Entity в свой проект. Я считаю, что эта проблема не по этой причине. Теперь появляется новая ошибка после реализации SqlResultSetMapping. Знаете ли вы, нужна ли мне специальная библиотека? –

ответ

0

Если вы хотите вернуть результаты собственного запроса объекту, я бы предложил использовать SqlResultSetMapping.

В противном случае, установите тип возвращаемого значения для:

List<Object[]> results = em.createNativeQuery(query) 
       .setParameter(1, numeroCeps) 
       .setParameter(2, numeroComplementoCeps) 
       .getResultList(); 

И затем петли через список результатов, и преобразуйте каждый элемент массива объекта к его типу данных.

+0

Я улучшил свой вопрос, поставив новый результат моего теста, применив ваше предложение использовать SqlResultSetMapping и поместив resultList в общий список объектов, но не работает. Спасибо за ваше время. –

0

< Список UnidadeTeste> lsita = новый ArrayList < UnidadeTeste>();

lsita = em.createNativeQuery (запрос, Unidade.класс)

Здесь есть несоответствие типа. Исключением ясно: Неизвестный объект: br.com.project.modelo. UnidadeTeste

Ваше предприятие является Unidade и вы должны так вернуть List<Unidade> не UnidadeTeste.

В противном случае попробуйте SqlResultSetMapping

+0

Это была моя ошибка, но даже исправить эту часть кода, пока не работает. Я улучшил свой вопрос, добавив новый результат моего теста, применив ваше предложение использовать SqlResultSetMapping, но не работает. Спасибо за ваше время. –

0

Мое решение было:

В этом разделе: How to map a Native Query to a POJO, when I do not have any Entity on my project? будут точно описать мою проблему. Но даже прочитав раньше, я не мог понять немного деталей, которые решили мою проблему.

Даже создание простой сущности для получателя в результате моего запроса необходимо сопоставить мой класс с persistence.xml. это была моя ошибка!

Итак, мой проект в настоящее время:

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 

    <persistence-unit name="projetoAtividade" transaction-type="JTA"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:/projetoAtividade</jta-data-source> 

     //another classes 

     <class>br.com.project.modelo.UnidadeTeste</class> 

     //properties of connection 

UnidadeTeste.class:

package br.com.project.modelo; 

import javax.persistence.Entity; 
import javax.persistence.Id; 

@Entity 
public class UnidadeTeste { 

    @Id 
    private Long id; 

    private String description; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

} 

EJB:

@SuppressWarnings("unchecked") 
    public void testeChamada(){ 
     List<UnidadeTeste> lista = em.createNativeQuery("SELECT nu_idntr_pessoa AS id, email AS description FROM Pessoa", UnidadeTeste.class).getResultList(); 
     System.out.println("===============>>"+lista.size()); 
    } 

Помните, что вам нужно поместить псевдонимы для столбца с t одно и то же имя по атрибутам, которые вы создали в своем классе.

Смежные вопросы