hibernate: проблема с выполнением запросов / отдельных критериев для встроенного объекта
Я столкнулся с проблемой запуска запроса или отдельного критерия для встроенного объекта. Я попробовал оба подхода из этого связанного вопроса, ни один из них не работает.
Я получаю ошибку:
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)
...
Вот мой код:
@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;
}
}
и это
@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;
}
}
Я пытался использовать запрос:
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();
И используя 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();
1 ответ
Решение
Свойства в HQL чувствительны к регистру, вам нужно location.longitude
вместо.