Problema com Hibernate ( org.hibernate.QueryException: could not resolve property)

Ola a todos,

Tenho tres classes: Collaborator, City e EmailCollaborator, a classe email colaborator se relacioana com as classes Collaborator e City;

@Entity
@Table(name="email_collaborator")
@SequenceGenerator(name="email_collaborator_id_seq", sequenceName="email_collaborator_id_seq")
public class EmailCollaborator {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "email_collaborator_id_seq")
    private Integer id;

    @ManyToOne
    @JoinColumn(name="login")
    private Collaborator collaborator;

    @ManyToOne
    @JoinColumn(name="symbol")
    private City symbol;

    public EmailCollaborator(Integer id, Collaborator collaborator, City symbol) {
        this.id = id;
        this.collaborator = collaborator;
        this.symbol = symbol;
    }

    public EmailCollaborator() {
    }

    public Collaborator getCollaborator() {
        return collaborator;
    }

    public void setCollaborator(Collaborator collaborator) {
        this.collaborator = collaborator;
    }

    public Integer getId() {
        return id;
    }

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

    public City getSymbol() {
        return symbol;
    }

    public void setSymbol(City symbol) {
        this.symbol = symbol;
    }
           
}
ackage br.com.model;

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

/**
 *
 * @author G0004830
 */

@Entity
public class City {

    @Id
    private String symbol;

    @Column(nullable=true)
    private String name;

    public City(String symbol) {
        this.symbol = symbol;
    }

    public City(String symbol, String name) {
        this.symbol = symbol;
        this.name = name;
    }

    public City() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSymbol() {
        return symbol;
    }

    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }
    
}
package br.com.model;

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

/**
 *
 * @author G0004830
 */

@Entity
public class Collaborator {

    @Id
    private String login;
    
    @Column(length=200, nullable=true)
    private String name;

    @Column(length=200, nullable=true)
    private String email;

    public Collaborator() {
    }

    public Collaborator(String login) {
        this.login = login;
    }
    
    public Collaborator(String login, String name, String email) {
        this.login = login;
        this.name = name;
        this.email = email;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
}

Preciso entao fazer uma pesquisa por Colaborador na Classe EmailCollaborador, criei um Dao onde está o codigo abaixo:

package br.com.dao;

import br.com.model.EmailCollaborator;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.MatchMode;

/**
 *
 * @author paulo
 */
public class DaoEmailCollaborator {

    private Dao<EmailCollaborator> daoGeneric;
    private Session session;

    public Dao<EmailCollaborator> getDaoGeneric() {
        return daoGeneric;
    }

    public DaoEmailCollaborator(Session session) {
        this.daoGeneric = new Dao<EmailCollaborator>(session, EmailCollaborator.class);
        this.session = session;
    }

    public List<EmailCollaborator> getListCitysByCollaborator(String login){
        Criteria criteria = this.session.createCriteria(EmailCollaborator.class);
        criteria.add(Expression.ilike("login", login, MatchMode.EXACT));
        return criteria.list();
    }
}

Quando executo a minha aplicação recebo o seguinte erro:

Exception in thread "main" org.hibernate.QueryException: could not resolve property: login of: br.com.model.EmailCollaborator
        at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44)
        at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)
        at org.hibernate.persister.entity.AbstractEntityPersister.getSubclassPropertyTableNumber(AbstractEntityPersister.java:1375)
        at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:31)
        at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1350)
        at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:434)
        at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumnsUsingProjection(CriteriaQueryTranslator.java:394)
        at org.hibernate.criterion.IlikeExpression.toSqlString(IlikeExpression.java:32)
        at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:334)
        at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:82)
        at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:67)
        at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1550)
        at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
        at br.com.dao.DaoEmailCollaborator.getListCitysByCollaborator(DaoEmailCollaborator.java:36)
        at br.com.gvt.seaccess.email.Email.sendEmailByCollaborator(Email.java:49)
        at sendemailelement.Main.main(Main.java:61)
Java Result: 1

Alguem sabe o que pode estar acontecendo?

Att,

Paulo

A classe EmailCollaborator não tem nenhuma propriedade login. Tem sim um collaborator que, por sua vez, tem um login.

Quando você usa hibernate ou JPA você deve usar sempre o nome dos campos Java, e não da coluna no banco. Além disso deve sempre ir navegando nas propriedades como se estivesse usando no JSTL.

Criteria criteria = this.session.createCriteria(EmailCollaborator.class); criteria.add(Expression.ilike("collaborator.login", login, MatchMode.EXACT));