Java 使用条件运行子查询时的ClassCastException(字符串到长)
首先,我的设置:Java 使用条件运行子查询时的ClassCastException(字符串到长),java,mysql,hibernate,classcastexception,hibernate-criteria,Java,Mysql,Hibernate,Classcastexception,Hibernate Criteria,首先,我的设置: mysql连接器java 5.1.24 hibernate core 4.1.10.Final 运行此条件查询时,我遇到一个ClassCastException: Criteria sellableItemsCriteria = session.createCriteria(MarketData.class, "md"); sellableItemsCriteria.add(Restrictions.in("region", regions)); sellableItemsCr
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,因此我切换为Long):
这是我想要运行的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
如何解决cast问题
或者也许有更好的方法用标准来实现这一点
谢谢我敢肯定,您会发现例外情况实际上来自这一行:
sellOrderSizeCriteria.add(Restrictions.eq("marketDataId", "md.id"));
此行尝试将MarketOrder
的marketDataId
属性与字符串“md.id”
进行比较。那不是你想做的。您要做的是将MarketOrder
的marketDataId
属性与md
的id
属性进行比较。因此,您需要使用:
如果字符串为
“1”
,且长度为1L
,equals()
返回false
。WilleqProperty()
返回true
?@acdcjunior:eqProperty在条件查询中比较两个实体的两个属性。最后,将使用生成的SQL=
子句进行比较。我看不出这与Java equals()方法有什么关系。谢谢你说得对,我被骗了,因为这个限制在子查询之前:/。@JBNizet我从文档中得到:对两个属性应用“相等”约束。无论如何,“1”(varchar)和“1”(数字)在eqProperty中被视为相等?不,我不认为在没有显式转换的情况下,可以将varchar和带有=的数字进行比较。这至少在PostgreSQL上不起作用。
sellOrderSizeCriteria.add(Restrictions.eq("marketDataId", "md.id"));
sellOrderSizeCriteria.add(Restrictions.eqProperty("marketDataId", "md.id"));