报错信息:
Caused by: org.postgresql.util.PSQLException: 错误: 操作符不存在: integer <> character varying
建议:没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换.
问题代码:
public List<CameraInfo> findWillBeDeletedCamerasByDeviceId(Long deviceId, List<String> channelNos) {
StringBuilder sb = new StringBuilder("SELECT camera FROM CameraInfo camera WHERE camera.deviceInfo.id=:deviceId");
sb.append(" and camera.status >= " + DataStatusType.NORMAL.getNumber());
if(CollectionUtils.isNotEmpty(channelNos)) {
sb.append(" and camera.channelNo not in(:channelNos)");
}
sb.append(" order by camera.channelNo asc");
Query query = this.getSession().createQuery(sb.toString());
query.setParameter("deviceId", deviceId);
query.setParameterList("channelNos", channelNos,new StringType());
return query.list();
}
解决:
public List<CameraInfo> findWillBeDeletedCamerasByDeviceId(Long deviceId, List<String> channelNos) {
List<Integer> chanNos = new ArrayList<Integer>();
for (String channo : channelNos) {
chanNos.add(Integer.valueOf(channo));
}
StringBuilder sb = new StringBuilder("SELECT camera FROM CameraInfo camera WHERE camera.deviceInfo.id=:deviceId");
sb.append(" and camera.status >= " + DataStatusType.NORMAL.getNumber());
if(CollectionUtils.isNotEmpty(channelNos)) {
sb.append(" and camera.channelNo not in(:channelNos)");
}
sb.append(" order by camera.channelNo asc");
Query query = this.getSession().createQuery(sb.toString());
query.setParameter("deviceId", deviceId);
query.setParameterList("channelNos", chanNos);
return query.list();
}
原因:
CameraInfo 中channelNo 为integer类型,低版本的hibernate无法有效进行类型的转换导致,需匹配正确的对象类型。