4

最初に私のセットアップ:

  1. mysql-connector-java 5.1.24
  2. hibernate-core 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

問題はこの行にあります (最初に 0L の代わりに 0 を試してみたところ、Integer を Long にキャストできないため、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

キャストの問題を解決するにはどうすればよいですか?

それとも、 Criteria でこれを行うためのより良い方法がありますか?

ありがとう

4

1 に答える 1

13

例外が実際には次の行から発生していることに気付くと思います。

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

marketDataIdこの行は、プロパティをMarketOrderStringと比較しようとします"md.id"。それはあなたがしたいことではありません。あなたがしたいことは、 のmarketDataIdプロパティをMarketOrderidプロパティと比較することですmd。したがって、代わりにeqProperty()を使用する必要があります。

sellOrderSizeCriteria.add(Restrictions.eqProperty("marketDataId", "md.id"));
于 2013-04-28T06:24:59.270 に答える