使用 Criteria 运行子查询时出现 ClassCastException (String to Long)

Posted

技术标签:

【中文标题】使用 Criteria 运行子查询时出现 ClassCastException (String to Long)【英文标题】:ClassCastException (String to Long) when running a subquery with Criteria 【发布时间】:2013-04-21 21:36:53 【问题描述】:

首先我的设置:

    mysql-connector-java 5.1.24 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

问题出在这一行(首先我尝试使用 0 而不是 0L,但我得到的 Integer cannot be cast to 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 做到这一点?

谢谢

【问题讨论】:

【参考方案1】:

我很确定您会发现异常实际上来自这一行:

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

此行尝试将MarketOrdermarketDataId 属性与字符串"md.id" 进行比较。那不是你想做的。您要做的是将MarketOrdermarketDataId 属性与mdid 属性进行比较。因此,您需要改用eqProperty():

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

【讨论】:

如果字符串是"1",long是1Lequals()返回falseeqProperty() 会返回 true 吗? @acdcjunior:eqProperty 比较条件查询中两个实体的两个属性。最后,将使用生成的 SQL = 子句进行比较。我看不出这与 Java 的 equals() 方法有什么关系。 谢谢你是对的,被骗了,因为这个限制在子查询之前:/。 @JBNizet 我从文档中得到:对两个属性应用“相等”约束。无论如何,'1'(varchar)和 1(数字)将被 eqProperty 视为相等? 不,我不认为你可以在没有明确强制转换的情况下将 varchar 和带有 = 的数字进行比较。至少,这在 PostgreSQL 上是行不通的。

以上是关于使用 Criteria 运行子查询时出现 ClassCastException (String to Long)的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate:在子选择查询中使用 IN 子句时出现错误

尝试子查询时出现不明确的列名错误

子查询在获取过去 X 周的数据时出现太多列错误?

使用 case when 时出现 SQL (Redshift) 错误 - 不支持这种类型的相关子查询模式

创建课程时出现 Google Clas-s-room 503 Service Unavailable Backend 错误

加入两个包含 SUM() 函数的子查询时出现无效操作错误