4

Первые мои расстановок:ClassCastException (String в Long) при выполнении подзапроса с критериями

  1. MySQL-разъем-Java 5.1.24
  2. гибернации-жильный 4.1.10.Final

у меня есть ClassCastException при выполнении этого критерии запроса:

Criteria sellableItemsCriteria = session.createCriteria(MarketData.class, "md"); 
sellableItemsCriteria.add(Restrictions.in("region", regions)); 
sellableItemsCriteria.add(Restrictions.in("itemTypeId", items)); 
DetachedCriteria sellOrderSizeCriteria = DetachedCriteria.forClass(MarketOrder.class); 
sellOrderSizeCriteria.add(Restrictions.eq("marketDataId", "md.id")); 
sellOrderSizeCriteria.add(Restrictions.eq("bid", false)); 
sellOrderSizeCriteria.setProjection(Projections.count("marketDataId")); 
sellableItemsCriteria.add(Subqueries.lt(0L, sellOrderSizeCriteria)); 

исключение:

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long 

Проблема с этой линии (первый я попытался с 0 вместо 0L и я получил целое не может быть приведен к Лонга, так что, почему я перешел на Long):

sellableItemsCriteria.add(Subqueries.lt(0L, sellOrderSizeCriteria)); 

И это является запросом mysql, который я хочу запустить:

SELECT md.* FROM `marketdata` md 
WHERE md.region IN (:regions) 
AND md.item_typeID IN (:items) 
AND (SELECT COUNT(marketData_id) FROM `marketorder` WHERE marketData_id = md.id AND bid = 0) > 0 

Как решить проблему с литьем?

Или, может быть, есть лучший способ сделать это с помощью критериев?

Благодаря

ответ

11

Я уверен, что вы обнаружите, что исключение приходит фактически из этой линии:

sellOrderSizeCriteria.add(Restrictions.eq("marketDataId", "md.id")); 

Эта линия пытается сравнить marketDataId свойство MarketOrder в строку "md.id". Это не то, что вы хотите сделать. Что вы хотите сделать, так это сравнить имущество marketDataId от MarketOrder до объекта id от md. И, таким образом, нужно использовать eqProperty() вместо:

sellOrderSizeCriteria.add(Restrictions.eqProperty("marketDataId", "md.id")); 
+0

Если строка ' "1"' и 'долго 1L',' равно() '' возвращает false'. Будет ли 'eqProperty()' return 'true'? – acdcjunior

+0

@acdcjunior: eqProperty сравнивает два свойства двух объектов в запросе Criteria. В итоге сравнение будет выполнено сгенерированным предложением SQL '='. Я не вижу, что это связано с методом Java equals(). –

+0

Спасибо, что вы были правы, обманули, потому что это были ограничения перед подзапросом: /. – Falydoor