2010-11-27 26 views
0

Je rencontre un problème lors de l'exécution d'une requête ou de critères détachés sur un objet incorporé. J'ai essayé tous les deux approché de this related question, aucun ne semble fonctionner.hibernate: Problème lors de l'exécution de requêtes/de critères détachés sur l'objet incorporé

L'erreur que je reçois est:

org.hibernate.QueryException: could not resolve property: location.Longitude of: org.project.model.Event [select c from org.project.model.Event as c WHERE c.location.Longitude between :minLongitude AND :maxLongitude] 
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:67) 
at org.hibernate.persister.entity.AbstractPropertyMapping.toColumns(AbstractPropertyMapping.java:82) 
at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:54) 
at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1367) 
... 

Voici mon code:

@Entity 
@Table(name = "Events") 
public class Event extends Identifiable { 
    private Location location; 
    private DateTime createdTS; 

    @Embedded 
    public Location getLocation() { 
     return location; 
    } 

    public Event setLocation(Location location) { 
     this.location = location; 
     return this; 
    } 

    @Column(name = "Created") 
    @Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime") 
    public DateTime getCreatedTS() { 
     return createdTS; 
    } 

    public Event setCreatedTS(DateTime createdTS) { 
     this.createdTS = createdTS; 
     return this; 
    } 
} 

et ce

@Embeddable 
public class Location { 
    private double longitude; 
    private double latitude; 

    public Location(double longitude, double latitude) { 
     setLongitude(longitude); 
     setLatitude(latitude); 
    } 

    public Location() {} 

    @Column(name = "Longitude") 
    public double getLongitude() { 
     return longitude; 
    } 

    public void setLongitude(double longitude) { 
     this.longitude = longitude; 
    } 

    @Column(name = "Latitude") 
    public double getLatitude() { 
     return latitude; 
    } 

    public void setLatitude(double latitude) { 
     this.latitude = latitude; 
    } 
} 

J'ai essayé d'utiliser une requête:

Query q = session.createQuery("select c from Event as c WHERE c.location.Longitude between :minLongitude AND :maxLongitude"); 
q.setParameter("minLongitude", minLongitude); 
q.setParameter("maxLongitude", maxLongitude); 
return (List<Event>)q.list(); 

Et en utilisant un DetachedCriteria:

final DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Event.class); 
detachedCriteria.add(Restrictions.between("Location.Longitude", minLongitude, maxLongitude)); 
detachedCriteria.add(Restrictions.between("Location.Latitude", minLatitude, maxLatitude)); 
Criteria criteria = detachedCriteria.getExecutableCriteria(session); 
return (List<Event>) criteria.list(); 

Répondre

1

Biens immobiliers à HQL sont sensibles à la casse, vous avez besoin location.longitude place.

+0

Oui, cela a fait l'affaire à la fois pour Query et DetachedCriteria. Merci! – ripper234