2015-03-29 2 views
3

Я хочу получить все магазины с рейтингом менее 4,2. Но мои критерии бросают ClassCastException. У меня есть следующий запрос критериев.Критерий запроса на спящий режим выдает исключение

double temp = 4.2; 
Criteria criteria = session.createCriteria(Shop.class, "s"); 
DetachedCriteria avg = DetachedCriteria.forClass(Rating.class, "r") 
       .setProjection(Projections.avg("r.value")) 
       .add(Restrictions.eq("r.shopId", "s.id")); 
criteria.add(Subqueries.gt(temp, avg)); 

Мои объекты:

@Entity 
@javax.persistence.Table(name = "shop") 
public class Shop implements LazyClonable<Shop> { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 

    private String name; 

    @Embedded 
    private Location location; 

    @Lob 
    private String description; 

//...getters and setters 
} 

@Entity 
@javax.persistence.Table(name = "rating") 
public class Rating implements LazyClonable<Rating> { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 

    private Float value; 
    private String comment; 

    @Transient 
    @ManyToOne(targetEntity = Shop.class) 
    @JoinColumn(name = "shop_id", insertable = false, updatable = false) 
    private Shop shop; 

    /** foreign key */ 
    @Column(name = "shop_id") 
    private Integer shopId; 

//...getters and setters 
} 

И бросает исключение. Зачем? Что я делаю неправильно? Исключение трассировки стека:

Mar 29, 2015 4:14:52 PM com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException 
SEVERE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container 
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer 
    at org.hibernate.type.descriptor.java.IntegerTypeDescriptor.unwrap(IntegerTypeDescriptor.java:36) 
    at org.hibernate.type.descriptor.sql.IntegerTypeDescriptor$1.doBind(IntegerTypeDescriptor.java:64) 
    at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:90) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:286) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:281) 
    at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1995) 
    at org.hibernate.loader.Loader.bindParameterValues(Loader.java:1966) 
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1901) 
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862) 
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:910) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355) 
    at org.hibernate.loader.Loader.doList(Loader.java:2554) 
    at org.hibernate.loader.Loader.doList(Loader.java:2540) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370) 
    at org.hibernate.loader.Loader.list(Loader.java:2365) 
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:126) 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1682) 

...

Я изменил запрос на родном SQL, но все еще получаю такое же исключение:

criteria.add(Restrictions.sqlRestriction(
      "(SELECT avg(r.value) FROM rating r WHERE s.id = r.shop_id) < ?", temp, DoubleType.INSTANCE)); 

ответ

4

С:

Restrictions.eq("r.shopId", "s.id") 

вам проверьте, соответствует ли значение shopId строковым значениям "s.id". Но shopId - целочисленный столбец, а "s.id" - строковое значение. Итак, это нормально, вы получаете исключение. И он не хочет, чтобы вы этого хотели. Вы не можете проверить равенство между столбцами. Вместо этого используйте:

Restrictions.eqProperty("r.shopId", "s.id") 
+0

Это работает !!!))) Большое вам спасибо! –

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