Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用条件运行子查询时的ClassCastException(字符串到长)_Java_Mysql_Hibernate_Classcastexception_Hibernate Criteria - Fatal编程技术网

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

首先,我的设置:

  • 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));
    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
    。Will
    eqProperty()
    返回
    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"));