错误:在java中无法执行sql语句,但在数据中是可以执行的。

时间:2021-11-01 21:25:43
//这是提示错误的代码
/**
 * 获取我的订单的所有订单信息
 */
@Override
public List<Order> FindAllByPage(int currPage, int pageSize, String uid)
throws Exception {
QueryRunner queryRunner = new QueryRunner(DataSourceUtils.getDataSource());

String sql="select * from orders where uid = ? order by ordertime desc limit ?,?";
//获取到我的所有订单 但还差订单项
List<Order> list = queryRunner.query(sql,new BeanListHandler<>(Order.class),uid,(currPage-1)*pageSize,pageSize);

//获取每个订单的订单项 因为在页面展示时也需展示订单项中商品的属性 所以使用了内联接
sql ="select * from orderitem oi,product p where oi.pid=p.pid and oi.oid = ? ";
for (Order order : list) {
//通过订单的id获取每个订单中的订单项
List<Map<String, Object>> mList = queryRunner.query(sql,new MapListHandler(),order.getOid());
//封装porduct,订单项
Product product = new Product();
OrderItem orderItem = new OrderItem();
for (Map<String, Object> map : mList) {
BeanUtils.populate(product, map);
BeanUtils.populate(orderItem, map);
}
//设置订单项中还未赋值的bean属性
orderItem.setPid(product);
orderItem.setOid(order);
//将订单项对象放入订单对象中的list集合
order.getOrderItems().add(orderItem);
}
return list;
}
//这是提示的异常信息
Caused by: java.sql.SQLException: Cannot set uid: incompatible types. Query: select * from orders where uid = ? order by ordertime desc limit ?,? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:320)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:349)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:287)
at com.itheima.dao.impl.OrderDaoImpl.FindAllByPage(OrderDaoImpl.java:77)
at com.itheima.service.impl.OrderServiceImpl.findAllByPage(OrderServiceImpl.java:56)
at com.itheima.servlet.OrderServlet.findAllByPage(OrderServlet.java:106)
... 28 more
//还有一些日志信息 今天早上清理了一下项目的缓存才有的
八月 31, 2017 8:34:14 上午 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
严重: The web application [/store] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
八月 31, 2017 8:34:14 上午 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/store] appears to have started a thread named [Timer-4] but has failed to stop it. This is very likely to create a memory leak.
八月 31, 2017 8:34:14 上午 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/store] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0] but has failed to stop it. This is very likely to create a memory leak.
八月 31, 2017 8:34:14 上午 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/store] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1] but has failed to stop it. This is very likely to create a memory leak.
八月 31, 2017 8:34:14 上午 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/store] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2] but has failed to stop it. This is very likely to create a memory leak.
八月 31, 2017 8:34:14 上午 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/store] appears to have started a thread named [Timer-5] but has failed to stop it. This is very likely to create a memory leak.
八月 31, 2017 8:34:14 上午 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/store] appears to have started a thread named [Timer-6] but has failed to stop it. This is very likely to create a memory leak.
八月 31, 2017 8:34:14 上午 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/store] appears to have started a thread named [Timer-7] but has failed to stop it. This is very likely to create a memory leak.

这个问题困扰了我两天了,若您有任何见解,可以进行评论,我会非常感谢您的。

41 个解决方案

#1


顶帖顶帖顶帖顶帖

#2


顶帖顶帖顶帖顶帖顶帖顶帖

#3


从你错误信息看Caused by: java.sql.SQLException: Cannot set uid: incompatible types. Query: select * from orders where uid = ? order by ordertime desc limit ?,? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
是uid类型与数据库中的类型不匹配啊

#4


引用 3 楼 wo_01220452 的回复:
从你错误信息看Caused by: java.sql.SQLException: Cannot set uid: incompatible types. Query: select * from orders where uid = ? order by ordertime desc limit ?,? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
是uid类型与数据库中的类型不匹配啊


 orders | CREATE TABLE `orders` (
  `oid` varchar(32) NOT NULL,
  `ordertime` datetime DEFAULT NULL,
  `total` double DEFAULT NULL,
  `state` int(11) DEFAULT NULL,
  `address` varchar(30) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `telephone` varchar(20) DEFAULT NULL,
  `uid` varchar(96) DEFAULT NULL,
  PRIMARY KEY (`oid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

#5


引用 3 楼 wo_01220452 的回复:
从你错误信息看Caused by: java.sql.SQLException: Cannot set uid: incompatible types. Query: select * from orders where uid = ? order by ordertime desc limit ?,? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
是uid类型与数据库中的类型不匹配啊

我以前这么想过,但现在的我觉得问题不是出在这上面,
在这错误之前,我也写过很多这样类似的sql语句,可以执行也有数据,但是在这次错误之后,
之前的sql语句可以执行但无法查询到数据了,
之后的sql语句直接无法执行,直接报这个异常了

#6


顶啊顶啊顶啊

#7


1.String sql = "select * from orders where uid = '0A67CD5136EF46D286DCDDEE2C4B60B9' order by ordertime desc limit 0,3";
先把sql语句写死 ,再执行下程序试试
2.记得查看过文章建议将tomcat 配置reloadable="false"  再重启试试

#8


引用 7 楼 JJYYyibanhua 的回复:
1.String sql = "select * from orders where uid = '0A67CD5136EF46D286DCDDEE2C4B60B9' order by ordertime desc limit 0,3";
先把sql语句写死 ,再执行下程序试试
2.记得查看过文章建议将tomcat 配置reloadable="false"  再重启试试

刚刚都试了试,还是报一样的错。

#9


引用 5 楼 IncoTe2000 的回复:
Quote: 引用 3 楼 wo_01220452 的回复:

从你错误信息看Caused by: java.sql.SQLException: Cannot set uid: incompatible types. Query: select * from orders where uid = ? order by ordertime desc limit ?,? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
是uid类型与数据库中的类型不匹配啊

我以前这么想过,但现在的我觉得问题不是出在这上面,
在这错误之前,我也写过很多这样类似的sql语句,可以执行也有数据,但是在这次错误之后,
之前的sql语句可以执行但无法查询到数据了,
之后的sql语句直接无法执行,直接报这个异常了

更正一下,之前的sql语句是可以执行可以获取到数据的 

#10


在数据库中可以执行,说明是你的传参有问题,有没有把传参环节打印出来看看?或者手动传参,如果手动传参不行,那就检查传参方式

#11


sql语句中写表映射的实体类名称,不要写表名

#12


引用 10 楼 a342108611 的回复:
在数据库中可以执行,说明是你的传参有问题,有没有把传参环节打印出来看看?或者手动传参,如果手动传参不行,那就检查传参方式

传参方式具体是指什么?不太懂

#13


引用 11 楼 l1994m 的回复:
sql语句中写表映射的实体类名称,不要写表名

 java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Order where uid = '0A67CD5136EF46D286DCDDEE2C4B60B9' order by ordertime desc lim' at line 1 Query: select * from Order where uid = ? order by ordertime desc limit ?,? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
不对啊

#14


顶顶顶顶顶!!!!!!!

#15


引用 13 楼 IncoTe2000 的回复:
Quote: 引用 11 楼 l1994m 的回复:

sql语句中写表映射的实体类名称,不要写表名

 java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Order where uid = '0A67CD5136EF46D286DCDDEE2C4B60B9' order by ordertime desc lim' at line 1 Query: select * from Order where uid = ? order by ordertime desc limit ?,? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
不对啊


order是关键字,别用做表名,或者`order`

#16


引用 15 楼 wo_01220452 的回复:
Quote: 引用 13 楼 IncoTe2000 的回复:

Quote: 引用 11 楼 l1994m 的回复:

sql语句中写表映射的实体类名称,不要写表名

 java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Order where uid = '0A67CD5136EF46D286DCDDEE2C4B60B9' order by ordertime desc lim' at line 1 Query: select * from Order where uid = ? order by ordertime desc limit ?,? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
不对啊


order是关键字,别用做表名,或者`order`

额 没有用order做表名,我那个Order是实体类。

#17


顶帖顶帖顶帖

#18


把你QueryRunner.query方法贴出来看下

#19


看看你的传参和以下例子有什么区别

1         List<Topic> topicList=new ArrayList<Topic>();
2         QueryRunner runner= new QueryRunner(JdbcUtil.getDataSource());
3         String sql ="select * from topic where type_id= ? order by time desc";
4         Object[] params={typeId};
5         topicList=runner.query(sql, new BeanListHandler<Topic>(Topic.class),params);
6         return topicList;

#20


select * from product where cid = ? limit ?,?
上面这条语句我放在这就可以执行
String sql="select * from orders where uid = ? order by ordertime desc limit ?,?";
//获取到我的所有订单 但还差订单项
List<Order> list = queryRunner.query(sql,new BeanListHandler<>(Order.class),uid,(currPage-1)*pageSize,pageSize);
似乎不是代码的问题 

这是商品表的创建代码
| product | CREATE TABLE `product` (
  `pid` varchar(32) NOT NULL,
  `pname` varchar(50) DEFAULT NULL,
  `market_price` double DEFAULT NULL,
  `shop_price` double DEFAULT NULL,
  `pimage` varchar(200) DEFAULT NULL,
  `pdate` datetime DEFAULT NULL,
  `is_hot` int(11) DEFAULT NULL,
  `pdesc` varchar(255) DEFAULT NULL,
  `pflag` int(11) DEFAULT NULL,
  `cid` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`pid`),
  KEY `sfk_0001` (`cid`),
  CONSTRAINT `sfk_0001` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

//这是订单表的创建代码
| orders | CREATE TABLE `orders` (
  `oid` varchar(32) NOT NULL,
  `ordertime` datetime DEFAULT NULL,
  `total` double DEFAULT NULL,
  `state` int(11) DEFAULT NULL,
  `address` varchar(30) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `telephone` varchar(20) DEFAULT NULL,
  `uid` varchar(96) DEFAULT NULL,
  PRIMARY KEY (`oid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

//这是订单项表的创建代码
 orderitem | CREATE TABLE `orderitem` (
  `itemid` varchar(32) NOT NULL,
  `count` int(11) DEFAULT NULL,
  `subtotal` double DEFAULT NULL,
  `pid` varchar(32) DEFAULT NULL,
  `oid` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`itemid`),
  KEY `fk_0001` (`pid`),
  KEY `fk_0002` (`oid`),
  CONSTRAINT `fk_0001` FOREIGN KEY (`pid`) REFERENCES `product` (`pid`),
  CONSTRAINT `fk_0002` FOREIGN KEY (`oid`) REFERENCES `orders` (`oid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

#21



引用 18 楼 shpery 的回复:
把你QueryRunner.query方法贴出来看下

dbutils的源代码包我没有。。。

#22


引用 19 楼 cky417 的回复:
看看你的传参和以下例子有什么区别

1         List<Topic> topicList=new ArrayList<Topic>();
2         QueryRunner runner= new QueryRunner(JdbcUtil.getDataSource());
3         String sql ="select * from topic where type_id= ? order by time desc";
4         Object[] params={typeId};
5         topicList=runner.query(sql, new BeanListHandler<Topic>(Topic.class),params);
6         return topicList;


1.你是new出来的集合在去接收 
2. 第四部我不明白是是什么

#23


应该是传参的问题,帮你找了个例子

    /** 
216.     * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中 
217.     *  
218.     * @param sql 
219.     *            sql语句 
220.     * @param params 
221.     *            参数数组 
222.     * @return 查询结果 
223.     */  
224.    @SuppressWarnings("unchecked")  
225.    public List<Map<String, Object>> findPage(String sql, int page, int count, Object... params) {  
226.        sql = sql + " LIMIT ?,?";  
227.        queryRunner = new QueryRunner(dataSource);  
228.        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
229.        try {  
230.            if (params == null) {  
231.                list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), new Integer[] { page,  
232.                        count });  
233.            } else {  
234.                list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), ArrayUtils.addAll(  
235.                        params, new Integer[] { page, count }));  
236.            }  
237.        } catch (SQLException e) {  
238.            e.printStackTrace();  
239.            LOG.error("map 数据分页查询错误", e);  
240.        }  
241.        return list;  
242.    }  

#24


引用 23 楼 cky417 的回复:
应该是传参的问题,帮你找了个例子

    /** 
216.     * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中 
217.     *  
218.     * @param sql 
219.     *            sql语句 
220.     * @param params 
221.     *            参数数组 
222.     * @return 查询结果 
223.     */  
224.    @SuppressWarnings("unchecked")  
225.    public List<Map<String, Object>> findPage(String sql, int page, int count, Object... params) {  
226.        sql = sql + " LIMIT ?,?";  
227.        queryRunner = new QueryRunner(dataSource);  
228.        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
229.        try {  
230.            if (params == null) {  
231.                list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), new Integer[] { page,  
232.                        count });  
233.            } else {  
234.                list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), ArrayUtils.addAll(  
235.                        params, new Integer[] { page, count }));  
236.            }  
237.        } catch (SQLException e) {  
238.            e.printStackTrace();  
239.            LOG.error("map 数据分页查询错误", e);  
240.        }  
241.        return list;  
242.    }  


引用 23 楼 cky417 的回复:
应该是传参的问题,帮你找了个例子

    /** 
216.     * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中 
217.     *  
218.     * @param sql 
219.     *            sql语句 
220.     * @param params 
221.     *            参数数组 
222.     * @return 查询结果 
223.     */  
224.    @SuppressWarnings("unchecked")  
225.    public List<Map<String, Object>> findPage(String sql, int page, int count, Object... params) {  
226.        sql = sql + " LIMIT ?,?";  
227.        queryRunner = new QueryRunner(dataSource);  
228.        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
229.        try {  
230.            if (params == null) {  
231.                list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), new Integer[] { page,  
232.                        count });  
233.            } else {  
234.                list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), ArrayUtils.addAll(  
235.                        params, new Integer[] { page, count }));  
236.            }  
237.        } catch (SQLException e) {  
238.            e.printStackTrace();  
239.            LOG.error("map 数据分页查询错误", e);  
240.        }  
241.        return list;  
242.    }  

原理是看懂了,我也用debug看了下,发现是用一个数组 一个字符一个字符装进去的 
但究竟怎么解决我还是有点脑袋疼。。

#25


我没有用过这个方法,但是觉得你的代码这样单个类型传参是有问题的,如果SQL语句里有多个参数怎么传?我觉得传一个参数集合才是合理的。你可以查一下官方的说明

#26


引用 25 楼 cky417 的回复:
我没有用过这个方法,但是觉得你的代码这样单个类型传参是有问题的,如果SQL语句里有多个参数怎么传?我觉得传一个参数集合才是合理的。你可以查一下官方的说明

//我按照那个案例去写了下
list = queryRunner.query(sql,new BeanListHandler<>(Order.class),ArrayUtils.addAll(new String[]{(uid)}, new String[] { Integer.toString((currPage-1)*pageSize), Integer.toString(pageSize) }));
//错误还是一样的。。
y: java.sql.SQLException: Cannot set uid: incompatible types. Query: select * from orders where uid = ? order by ordertime desc limit ? , ? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:320)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:349)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:287)
at com.itheima.dao.impl.OrderDaoImpl.FindAllByPage(OrderDaoImpl.java:78)
at com.itheima.service.impl.OrderServiceImpl.findAllByPage(OrderServiceImpl.java:56)
at com.itheima.servlet.OrderServlet.findAllByPage(OrderServlet.java:107)
... 28 more

#27


你先把分页的limit ? , ?去掉,参数也去掉,看看怎么样,反正多试一下,或者改个其他表试试能不能查出数据,先保证写法没问题

#28


.//写这句会报错
select * from orders order by ordertime desc
//写这句不会报错 参数也能传递过去
select * from product where cid = ? limit ?,?
//参数我用的都是一样的
list = queryRunner.query(sql,new BeanListHandler<>(Order.class),ArrayUtils.addAll(new String[]{(uid)}, new String[] { Integer.toString((currPage-1)*pageSize), Integer.toString(pageSize) }));

好像是orders表的问题

#29


select * from`orders` order by ordertime desc

你这样写试试

#30


//报出了这个异常
Caused by: java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''orders' order by ordertime desc' at line 1 Query: select * from 'orders' order by ordertime desc Parameters: []

#31


引用 29 楼 wo_01220452 的回复:
select * from`orders` order by ordertime desc

你这样写试试


//报出了这个异常
Caused by: java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''orders' order by ordertime desc' at line 1 Query: select * from 'orders' order by ordertime desc Parameters: []

#32


首先,你的sql语法上是没有问题的,可以正常执行。而且从报错上来看,是和参数uid有关,你是否有试过不要uid是可以正常查询的?问题在uid上,那么,你sql在设置值的时候uid是String类型吗?
错误信息是不能设置uid,你在仔细看看有关uid的地方,有没有set方法呀,之类的~!

#33


//现在不设uid都这个错误
String sql = "select * from orders";
List<Order> list = new ArrayList<Order>();
list = queryRunner.query(sql,new BeanListHandler<>(Order.class));

异常:
Cannot set uid: incompatible types. Query: select * from orders Parameters: []

#34


引用 32 楼 liutianxiong888 的回复:
首先,你的sql语法上是没有问题的,可以正常执行。而且从报错上来看,是和参数uid有关,你是否有试过不要uid是可以正常查询的?问题在uid上,那么,你sql在设置值的时候uid是String类型吗?
错误信息是不能设置uid,你在仔细看看有关uid的地方,有没有set方法呀,之类的~!

您分析的很有道理,我也想过,但不是java中这个uid的错误,
//只有有关查询这两个表才会报异常
select * from orders
select * from user
写其他的表的查询语句是可以使用的

//写这句不但不会报错 参数也能传递过去 说明不是uid的问题
select * from product where cid = ? limit ?,?
//参数我用的都是一样的
list = queryRunner.query(sql,new BeanListHandler<>(Order.class),ArrayUtils.addAll(new String[]{(uid)}, new String[] { Integer.toString((currPage-1)*pageSize), Integer.toString(pageSize) }));

#35


也不是数据库的错误,因为我在数据库中查询所有表的数据都能查的出来

#36


引用 31 楼 IncoTe2000 的回复:
Quote: 引用 29 楼 wo_01220452 的回复:

select * from`orders` order by ordertime desc

你这样写试试


//报出了这个异常
Caused by: java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''orders' order by ordertime desc' at line 1 Query: select * from 'orders' ’order by ordertime desc Parameters: []


不是用单引号,是用tab键上面那个键,是`orders` ,不是'orders'

#37


这个错误是出在查询出数据后,在写入实体类的时候出现类型错误,不能写入实体类。
检查实体类中的 uid 的类型和数据库中的类型是否一致。

#38


是hibernate吧?检查下Order实体的配置情况。

#39


引用 37 楼 zssazrael 的回复:
这个错误是出在查询出数据后,在写入实体类的时候出现类型错误,不能写入实体类。
检查实体类中的 uid 的类型和数据库中的类型是否一致。

感谢您,这个问题解决了。
原因是我把uid设置成了user类型,我一直以为是传出的有问题,没想到是封装对象时传入的数据与我设置的类型不同。
感觉又上了一课。

#40


感谢各位评论的小伙伴们~,谢谢你们!!! 错误:在java中无法执行sql语句,但在数据中是可以执行的。

#41


order是个关键字,你把这个实体类或者表名都不要叫这个,就没问题了,mysql数据库表名或者映射类叫order就会报这个错

#1


顶帖顶帖顶帖顶帖

#2


顶帖顶帖顶帖顶帖顶帖顶帖

#3


从你错误信息看Caused by: java.sql.SQLException: Cannot set uid: incompatible types. Query: select * from orders where uid = ? order by ordertime desc limit ?,? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
是uid类型与数据库中的类型不匹配啊

#4


引用 3 楼 wo_01220452 的回复:
从你错误信息看Caused by: java.sql.SQLException: Cannot set uid: incompatible types. Query: select * from orders where uid = ? order by ordertime desc limit ?,? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
是uid类型与数据库中的类型不匹配啊


 orders | CREATE TABLE `orders` (
  `oid` varchar(32) NOT NULL,
  `ordertime` datetime DEFAULT NULL,
  `total` double DEFAULT NULL,
  `state` int(11) DEFAULT NULL,
  `address` varchar(30) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `telephone` varchar(20) DEFAULT NULL,
  `uid` varchar(96) DEFAULT NULL,
  PRIMARY KEY (`oid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

#5


引用 3 楼 wo_01220452 的回复:
从你错误信息看Caused by: java.sql.SQLException: Cannot set uid: incompatible types. Query: select * from orders where uid = ? order by ordertime desc limit ?,? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
是uid类型与数据库中的类型不匹配啊

我以前这么想过,但现在的我觉得问题不是出在这上面,
在这错误之前,我也写过很多这样类似的sql语句,可以执行也有数据,但是在这次错误之后,
之前的sql语句可以执行但无法查询到数据了,
之后的sql语句直接无法执行,直接报这个异常了

#6


顶啊顶啊顶啊

#7


1.String sql = "select * from orders where uid = '0A67CD5136EF46D286DCDDEE2C4B60B9' order by ordertime desc limit 0,3";
先把sql语句写死 ,再执行下程序试试
2.记得查看过文章建议将tomcat 配置reloadable="false"  再重启试试

#8


引用 7 楼 JJYYyibanhua 的回复:
1.String sql = "select * from orders where uid = '0A67CD5136EF46D286DCDDEE2C4B60B9' order by ordertime desc limit 0,3";
先把sql语句写死 ,再执行下程序试试
2.记得查看过文章建议将tomcat 配置reloadable="false"  再重启试试

刚刚都试了试,还是报一样的错。

#9


引用 5 楼 IncoTe2000 的回复:
Quote: 引用 3 楼 wo_01220452 的回复:

从你错误信息看Caused by: java.sql.SQLException: Cannot set uid: incompatible types. Query: select * from orders where uid = ? order by ordertime desc limit ?,? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
是uid类型与数据库中的类型不匹配啊

我以前这么想过,但现在的我觉得问题不是出在这上面,
在这错误之前,我也写过很多这样类似的sql语句,可以执行也有数据,但是在这次错误之后,
之前的sql语句可以执行但无法查询到数据了,
之后的sql语句直接无法执行,直接报这个异常了

更正一下,之前的sql语句是可以执行可以获取到数据的 

#10


在数据库中可以执行,说明是你的传参有问题,有没有把传参环节打印出来看看?或者手动传参,如果手动传参不行,那就检查传参方式

#11


sql语句中写表映射的实体类名称,不要写表名

#12


引用 10 楼 a342108611 的回复:
在数据库中可以执行,说明是你的传参有问题,有没有把传参环节打印出来看看?或者手动传参,如果手动传参不行,那就检查传参方式

传参方式具体是指什么?不太懂

#13


引用 11 楼 l1994m 的回复:
sql语句中写表映射的实体类名称,不要写表名

 java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Order where uid = '0A67CD5136EF46D286DCDDEE2C4B60B9' order by ordertime desc lim' at line 1 Query: select * from Order where uid = ? order by ordertime desc limit ?,? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
不对啊

#14


顶顶顶顶顶!!!!!!!

#15


引用 13 楼 IncoTe2000 的回复:
Quote: 引用 11 楼 l1994m 的回复:

sql语句中写表映射的实体类名称,不要写表名

 java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Order where uid = '0A67CD5136EF46D286DCDDEE2C4B60B9' order by ordertime desc lim' at line 1 Query: select * from Order where uid = ? order by ordertime desc limit ?,? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
不对啊


order是关键字,别用做表名,或者`order`

#16


引用 15 楼 wo_01220452 的回复:
Quote: 引用 13 楼 IncoTe2000 的回复:

Quote: 引用 11 楼 l1994m 的回复:

sql语句中写表映射的实体类名称,不要写表名

 java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Order where uid = '0A67CD5136EF46D286DCDDEE2C4B60B9' order by ordertime desc lim' at line 1 Query: select * from Order where uid = ? order by ordertime desc limit ?,? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
不对啊


order是关键字,别用做表名,或者`order`

额 没有用order做表名,我那个Order是实体类。

#17


顶帖顶帖顶帖

#18


把你QueryRunner.query方法贴出来看下

#19


看看你的传参和以下例子有什么区别

1         List<Topic> topicList=new ArrayList<Topic>();
2         QueryRunner runner= new QueryRunner(JdbcUtil.getDataSource());
3         String sql ="select * from topic where type_id= ? order by time desc";
4         Object[] params={typeId};
5         topicList=runner.query(sql, new BeanListHandler<Topic>(Topic.class),params);
6         return topicList;

#20


select * from product where cid = ? limit ?,?
上面这条语句我放在这就可以执行
String sql="select * from orders where uid = ? order by ordertime desc limit ?,?";
//获取到我的所有订单 但还差订单项
List<Order> list = queryRunner.query(sql,new BeanListHandler<>(Order.class),uid,(currPage-1)*pageSize,pageSize);
似乎不是代码的问题 

这是商品表的创建代码
| product | CREATE TABLE `product` (
  `pid` varchar(32) NOT NULL,
  `pname` varchar(50) DEFAULT NULL,
  `market_price` double DEFAULT NULL,
  `shop_price` double DEFAULT NULL,
  `pimage` varchar(200) DEFAULT NULL,
  `pdate` datetime DEFAULT NULL,
  `is_hot` int(11) DEFAULT NULL,
  `pdesc` varchar(255) DEFAULT NULL,
  `pflag` int(11) DEFAULT NULL,
  `cid` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`pid`),
  KEY `sfk_0001` (`cid`),
  CONSTRAINT `sfk_0001` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

//这是订单表的创建代码
| orders | CREATE TABLE `orders` (
  `oid` varchar(32) NOT NULL,
  `ordertime` datetime DEFAULT NULL,
  `total` double DEFAULT NULL,
  `state` int(11) DEFAULT NULL,
  `address` varchar(30) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `telephone` varchar(20) DEFAULT NULL,
  `uid` varchar(96) DEFAULT NULL,
  PRIMARY KEY (`oid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

//这是订单项表的创建代码
 orderitem | CREATE TABLE `orderitem` (
  `itemid` varchar(32) NOT NULL,
  `count` int(11) DEFAULT NULL,
  `subtotal` double DEFAULT NULL,
  `pid` varchar(32) DEFAULT NULL,
  `oid` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`itemid`),
  KEY `fk_0001` (`pid`),
  KEY `fk_0002` (`oid`),
  CONSTRAINT `fk_0001` FOREIGN KEY (`pid`) REFERENCES `product` (`pid`),
  CONSTRAINT `fk_0002` FOREIGN KEY (`oid`) REFERENCES `orders` (`oid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

#21



引用 18 楼 shpery 的回复:
把你QueryRunner.query方法贴出来看下

dbutils的源代码包我没有。。。

#22


引用 19 楼 cky417 的回复:
看看你的传参和以下例子有什么区别

1         List<Topic> topicList=new ArrayList<Topic>();
2         QueryRunner runner= new QueryRunner(JdbcUtil.getDataSource());
3         String sql ="select * from topic where type_id= ? order by time desc";
4         Object[] params={typeId};
5         topicList=runner.query(sql, new BeanListHandler<Topic>(Topic.class),params);
6         return topicList;


1.你是new出来的集合在去接收 
2. 第四部我不明白是是什么

#23


应该是传参的问题,帮你找了个例子

    /** 
216.     * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中 
217.     *  
218.     * @param sql 
219.     *            sql语句 
220.     * @param params 
221.     *            参数数组 
222.     * @return 查询结果 
223.     */  
224.    @SuppressWarnings("unchecked")  
225.    public List<Map<String, Object>> findPage(String sql, int page, int count, Object... params) {  
226.        sql = sql + " LIMIT ?,?";  
227.        queryRunner = new QueryRunner(dataSource);  
228.        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
229.        try {  
230.            if (params == null) {  
231.                list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), new Integer[] { page,  
232.                        count });  
233.            } else {  
234.                list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), ArrayUtils.addAll(  
235.                        params, new Integer[] { page, count }));  
236.            }  
237.        } catch (SQLException e) {  
238.            e.printStackTrace();  
239.            LOG.error("map 数据分页查询错误", e);  
240.        }  
241.        return list;  
242.    }  

#24


引用 23 楼 cky417 的回复:
应该是传参的问题,帮你找了个例子

    /** 
216.     * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中 
217.     *  
218.     * @param sql 
219.     *            sql语句 
220.     * @param params 
221.     *            参数数组 
222.     * @return 查询结果 
223.     */  
224.    @SuppressWarnings("unchecked")  
225.    public List<Map<String, Object>> findPage(String sql, int page, int count, Object... params) {  
226.        sql = sql + " LIMIT ?,?";  
227.        queryRunner = new QueryRunner(dataSource);  
228.        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
229.        try {  
230.            if (params == null) {  
231.                list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), new Integer[] { page,  
232.                        count });  
233.            } else {  
234.                list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), ArrayUtils.addAll(  
235.                        params, new Integer[] { page, count }));  
236.            }  
237.        } catch (SQLException e) {  
238.            e.printStackTrace();  
239.            LOG.error("map 数据分页查询错误", e);  
240.        }  
241.        return list;  
242.    }  


引用 23 楼 cky417 的回复:
应该是传参的问题,帮你找了个例子

    /** 
216.     * 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中 
217.     *  
218.     * @param sql 
219.     *            sql语句 
220.     * @param params 
221.     *            参数数组 
222.     * @return 查询结果 
223.     */  
224.    @SuppressWarnings("unchecked")  
225.    public List<Map<String, Object>> findPage(String sql, int page, int count, Object... params) {  
226.        sql = sql + " LIMIT ?,?";  
227.        queryRunner = new QueryRunner(dataSource);  
228.        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
229.        try {  
230.            if (params == null) {  
231.                list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), new Integer[] { page,  
232.                        count });  
233.            } else {  
234.                list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), ArrayUtils.addAll(  
235.                        params, new Integer[] { page, count }));  
236.            }  
237.        } catch (SQLException e) {  
238.            e.printStackTrace();  
239.            LOG.error("map 数据分页查询错误", e);  
240.        }  
241.        return list;  
242.    }  

原理是看懂了,我也用debug看了下,发现是用一个数组 一个字符一个字符装进去的 
但究竟怎么解决我还是有点脑袋疼。。

#25


我没有用过这个方法,但是觉得你的代码这样单个类型传参是有问题的,如果SQL语句里有多个参数怎么传?我觉得传一个参数集合才是合理的。你可以查一下官方的说明

#26


引用 25 楼 cky417 的回复:
我没有用过这个方法,但是觉得你的代码这样单个类型传参是有问题的,如果SQL语句里有多个参数怎么传?我觉得传一个参数集合才是合理的。你可以查一下官方的说明

//我按照那个案例去写了下
list = queryRunner.query(sql,new BeanListHandler<>(Order.class),ArrayUtils.addAll(new String[]{(uid)}, new String[] { Integer.toString((currPage-1)*pageSize), Integer.toString(pageSize) }));
//错误还是一样的。。
y: java.sql.SQLException: Cannot set uid: incompatible types. Query: select * from orders where uid = ? order by ordertime desc limit ? , ? Parameters: [0A67CD5136EF46D286DCDDEE2C4B60B9, 0, 3]
at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:320)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:349)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:287)
at com.itheima.dao.impl.OrderDaoImpl.FindAllByPage(OrderDaoImpl.java:78)
at com.itheima.service.impl.OrderServiceImpl.findAllByPage(OrderServiceImpl.java:56)
at com.itheima.servlet.OrderServlet.findAllByPage(OrderServlet.java:107)
... 28 more

#27


你先把分页的limit ? , ?去掉,参数也去掉,看看怎么样,反正多试一下,或者改个其他表试试能不能查出数据,先保证写法没问题

#28


.//写这句会报错
select * from orders order by ordertime desc
//写这句不会报错 参数也能传递过去
select * from product where cid = ? limit ?,?
//参数我用的都是一样的
list = queryRunner.query(sql,new BeanListHandler<>(Order.class),ArrayUtils.addAll(new String[]{(uid)}, new String[] { Integer.toString((currPage-1)*pageSize), Integer.toString(pageSize) }));

好像是orders表的问题

#29


select * from`orders` order by ordertime desc

你这样写试试

#30


//报出了这个异常
Caused by: java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''orders' order by ordertime desc' at line 1 Query: select * from 'orders' order by ordertime desc Parameters: []

#31


引用 29 楼 wo_01220452 的回复:
select * from`orders` order by ordertime desc

你这样写试试


//报出了这个异常
Caused by: java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''orders' order by ordertime desc' at line 1 Query: select * from 'orders' order by ordertime desc Parameters: []

#32


首先,你的sql语法上是没有问题的,可以正常执行。而且从报错上来看,是和参数uid有关,你是否有试过不要uid是可以正常查询的?问题在uid上,那么,你sql在设置值的时候uid是String类型吗?
错误信息是不能设置uid,你在仔细看看有关uid的地方,有没有set方法呀,之类的~!

#33


//现在不设uid都这个错误
String sql = "select * from orders";
List<Order> list = new ArrayList<Order>();
list = queryRunner.query(sql,new BeanListHandler<>(Order.class));

异常:
Cannot set uid: incompatible types. Query: select * from orders Parameters: []

#34


引用 32 楼 liutianxiong888 的回复:
首先,你的sql语法上是没有问题的,可以正常执行。而且从报错上来看,是和参数uid有关,你是否有试过不要uid是可以正常查询的?问题在uid上,那么,你sql在设置值的时候uid是String类型吗?
错误信息是不能设置uid,你在仔细看看有关uid的地方,有没有set方法呀,之类的~!

您分析的很有道理,我也想过,但不是java中这个uid的错误,
//只有有关查询这两个表才会报异常
select * from orders
select * from user
写其他的表的查询语句是可以使用的

//写这句不但不会报错 参数也能传递过去 说明不是uid的问题
select * from product where cid = ? limit ?,?
//参数我用的都是一样的
list = queryRunner.query(sql,new BeanListHandler<>(Order.class),ArrayUtils.addAll(new String[]{(uid)}, new String[] { Integer.toString((currPage-1)*pageSize), Integer.toString(pageSize) }));

#35


也不是数据库的错误,因为我在数据库中查询所有表的数据都能查的出来

#36


引用 31 楼 IncoTe2000 的回复:
Quote: 引用 29 楼 wo_01220452 的回复:

select * from`orders` order by ordertime desc

你这样写试试


//报出了这个异常
Caused by: java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''orders' order by ordertime desc' at line 1 Query: select * from 'orders' ’order by ordertime desc Parameters: []


不是用单引号,是用tab键上面那个键,是`orders` ,不是'orders'

#37


这个错误是出在查询出数据后,在写入实体类的时候出现类型错误,不能写入实体类。
检查实体类中的 uid 的类型和数据库中的类型是否一致。

#38


是hibernate吧?检查下Order实体的配置情况。

#39


引用 37 楼 zssazrael 的回复:
这个错误是出在查询出数据后,在写入实体类的时候出现类型错误,不能写入实体类。
检查实体类中的 uid 的类型和数据库中的类型是否一致。

感谢您,这个问题解决了。
原因是我把uid设置成了user类型,我一直以为是传出的有问题,没想到是封装对象时传入的数据与我设置的类型不同。
感觉又上了一课。

#40


感谢各位评论的小伙伴们~,谢谢你们!!! 错误:在java中无法执行sql语句,但在数据中是可以执行的。

#41


order是个关键字,你把这个实体类或者表名都不要叫这个,就没问题了,mysql数据库表名或者映射类叫order就会报这个错

相关文章