Java JDBCExceptionReporter-组合中不兼容的数据类型

Java JDBCExceptionReporter-组合中不兼容的数据类型,java,hibernate,spring,Java,Hibernate,Spring,在运行以下代码时,出现错误“JDBCExceptionReporter-组合中的不兼容数据类型”: public Collection<SensorReading> getLastReadings(int[] sensorIds) throws DataAccessException { StringBuilder sb = new StringBuilder(); sb.append("SELECT r "); sb.appe

在运行以下代码时,出现错误“JDBCExceptionReporter-组合中的不兼容数据类型”:

    public Collection<SensorReading> getLastReadings(int[] sensorIds)
    throws DataAccessException {
            StringBuilder sb = new StringBuilder();
    sb.append("SELECT r ");
    sb.append("FROM Sensor AS s, SensorReading AS r ");
    sb.append("WHERE s.id IN (");
    for(int sensId:sensorIds){
        sb.append("'");
        sb.append(sensId);
        sb.append("',");
    }
    //strip off the last comma
    sb.setLength(sb.length() -1);
    //build the rest of the query
    sb.append(")  AND s.id = r.sensorId ");
    sb.append("   AND r.readingTimestampUtc >= s.lastBeaconUtc ");
    List<SensorReading> readings = getHibernateTemplate().find(sb.toString());
    //map to hold only the latest result
    Map<Integer, SensorReading> readingsMap = new HashMap<Integer, SensorReading>();
    //flash through the readings and make sure there's only one per sensor ID
    for(SensorReading rdg:readings){
        Integer sensorId = rdg.getSensorId();
        SensorReading reading = readingsMap.get(sensorId);
        if(reading==null){
            readingsMap.put(sensorId, rdg);
        }
        else{
            //replace if the new reading is later
            if(reading.getReadingTimestampUtc().after(rdg.getReadingTimestampUtc())){
                readingsMap.put(sensorId, reading);
            }
        }
    }
    return readingsMap.values();
}
公共集合GetLastReaders(int[]SensorId)
抛出DataAccessException{
StringBuilder sb=新的StringBuilder();
sb.附加(“选择r”);
sb.附加(“传感器为s,传感器读数为r”);
sb.追加(“其中s.id在(”);
用于(int sensId:SENSORID){
某人加上(“”);
某人附加(敏感的);
某人加上(“,”);
}
//去掉最后一个逗号
sb.setLength(sb.length()-1);
//构建查询的其余部分
sb.附加(“)和s.id=r.sensorId”);
sb.追加(“和r.readingTimestampUtc>=s.lastBeaconUtc”);
列表读数=getHibernateTemplate().find(sb.toString());
//映射以仅保存最新结果
Map readingsMap=newhashmap();
//快速浏览读数,确保每个传感器ID只有一个
用于(传感器读数rdg:读数){
整数sensorId=rdg.getSensorId();
SensorReading=ReadingMap.get(传感器ID);
如果(读取==null){
ReadingMap.put(传感器ID,rdg);
}
否则{
//如果新读数更晚,则更换
if(reading.getReadingTimestampUtc().after(rdg.getReadingTimestampUtc())){
ReadingMap.put(传感器ID,读取);
}
}
}
返回readingMap.values();
}

sensor id和sensorreading sensorid都是整数,其他联接都是日期。你知道我为什么会得到这个吗?

哎呀!问题是列表中ID周围的引号


为什么hibernate不能正确处理这个问题?

如果
传感器ID
是整数,HQL应该如下所示

for(int sensId:sensorIds){
      //  sb.append("'");
        sb.append(sensId);
       // sb.append("',");
       sb.append(",");
}
在任何查询中,无论是
SQL还是HQL
,整数都不应位于
引号(')


你说“上述错误”是指什么?
in (1,2,3) -- For the integers

in ('a','b','c') -- For the char types