JPA + Where [Solucionado]

Pessoal,

Estou usando o JPA com hibernate e não estou conseguindo fazer uma busca filtrando por um campo que tem relacionamento.

tenho a seguinte entidade:


@Entity
public class MaquinaServico implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "id", nullable = false)
    private Long id;
    @JoinColumn(name = "id_maquina", referencedColumnName = "id", nullable = false)
    @ManyToOne(optional = false)
    private Maquina idMaquina;
    @JoinColumn(name = "id_servico", referencedColumnName = "id", nullable = false)
    @ManyToOne(optional = false)
    private Servico idServico;
 
  // gets and sets 
}

E a seguinte consulta funciona:

    public boolean teste(Maquina maquina, Servico servico) {
        String query = "SELECT m FROM MaquinaServico m where m.id = :Maquina ";        
        Query q = getEntityManager().createQuery(query);
        q.setParameter("Maquina", 1L);
        return (q.getResultList().size() > 0 ? true : false);
    }

Mas se fizer a mesma consulta so que com o where o campo idMaquina da erro:

    public boolean teste(Maquina maquina, Servico servico) {
        String query = "SELECT m FROM MaquinaServico m where m.idMaquina = :Maquina ";        
        Query q = getEntityManager().createQuery(query);
        q.setParameter("Maquina", 1L);
        return (q.getResultList().size() > 0 ? true : false);
    }

erro:

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of bit.entidade.Maquina.id
        at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:637)
        at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:74)
        at bit.dao.impl.MaquinaServicoDaoImpl.teste(MaquinaServicoDaoImpl.java:47)
        at bit.service.MaquinaService.TemServico(MaquinaService.java:42)
        at Main.main(Main.java:29)
Caused by: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of bit.entidade.Maquina.id
        at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:35)
        at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:183)
        at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3591)
        at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3307)
        at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:181)
        at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:218)
        at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)
        at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:87)
        at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:38)
        at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:491)
        at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1563)
        at org.hibernate.loader.Loader.doQuery(Loader.java:673)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
        at org.hibernate.loader.Loader.doList(Loader.java:2220)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
        at org.hibernate.loader.Loader.list(Loader.java:2099)
        at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
        at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
        at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
        at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
        at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
        at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:65)
        ... 3 more
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field bit.entidade.Maquina.id to java.lang.Long
        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)
        at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
        at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:18)
        at java.lang.reflect.Field.get(Field.java:358)
        at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:32)
        ... 24 more
Java Result: 1

Alguém tem alguma ideia ?

Obrigado,

Marcelo Gomes

idMaquina é uma Entity do Tipo Máquina que provavelmente deve ter um atributo id;

Assim não funcionaria:

    public boolean teste(Maquina maquina, Servico servico) {  
    String query = "SELECT m FROM MaquinaServico m where m.idMaquina.id = :Maquina ";          
    Query q = getEntityManager().createQuery(query);  
    q.setParameter("Maquina", 1L);  
    return (q.getResultList().size() > 0 ? true : false);  
} 

??

PS: Estou chutando que tem um atributo @Id na classe Maquina que se chama id. Qualquer coisa poste sua classe Maquina também.

Abraços!

Na mosca!!! Obrigado

(Na mosca)²

Na mosca³

O TÓPICO É JAVA BÁSICO, APRENDA ISSO, DEVERIA ESTAR EM PERSISTENCIA.
LEIA AS REGRAS

Q BLZ!!!

[quote=RenanRosa]O TÓPICO É JAVA BÁSICO, APRENDA ISSO, DEVERIA ESTAR EM PERSISTENCIA.
LEIA AS REGRAS[/quote]

na mosca 4!

muito obrigado ajfilho! :smiley:

[]'s
t++