首页新闻找找看学习计划

hibernate的使用原生sql,动态传入表名,发送sql语句的表名和传入sql的表名不一样

0
悬赏园豆:20 [待解决问题]

分了100张表,tb_00~tb_99,
使用HibernateTemplate,用远程sql查询,每次传入表名
代码如下:
SlUserPageInfo pageInfos = hibernateTemplateR.execute(new HibernateCallback<SlUserPageInfo>() {

@Override
public SlUserPageInfo doInHibernate(Session session) throws HibernateException {
SlUserPageInfo pageInfo = new SlUserPageInfo();
String tableName = "tb_";
if (tableNumber < 10) {
tableName += "0";
}
tableName += tableNumber;
System.out.println(tableName);
String andEndTime = "";
if (!StringUtils.isEmpty(endTimeStamp)) {
andEndTime = " and TimeStamp<=:endTimeStamp";
}
totalPage = (int) Math.ceil(((double) count) / pageSize);
pageInfo.setTotalPage((long) totalPage);
String sql = "select * from " + tableName + " where TimeStamp>:startTimeStamp"
+ andEndTime + " order by TimeStamp desc offset " + ((pageIndex - 1) * 10)
+ " rows fetch next " + pageSize + " rows only";
SQLQuery sqlQuery = session.createSQLQuery(sql).addEntity(User.class);
sqlQuery.setBinary("startTimeStamp", startBytes);
if (!StringUtils.isEmpty(endTimeStamp)) {
sqlQuery.setBinary("endTimeStamp", endBytes);
}
@SuppressWarnings("unchecked")
List<User> listQuery = (List<User>) sqlQuery.list();
if (listQuery != null && listQuery.size() > 0) {
pageInfo.setUsers(listQuery);
}
}
return pageInfo;
}
});
return pageInfos;

我拼写的sql语句是:
select * from tb_00 where TimeStamp>:startTimeStamp order by TimeStamp desc offset 0 rows fetch next 1 rows only
但是发送的却是:
Hibernate:
select
*
from
tb_01
where
TimeStamp>?
order by
TimeStamp desc offset 0 rows fetch next 1 rows only

传入sql语句查询tb_00表,但是发送sql语句却是查询tb_01表。
之前查过tb_01表,是不是sql语句被缓存了?怎么清除sql语句缓存?

moyuguixiong的主页 moyuguixiong | 初学一级 | 园豆:133
提问于:2018-01-05 15:34
< >
分享
所有回答(2)
0

晚上来看看!

David5201 | 园豆:534 (小虾三级) | 2018-01-05 15:45

知道什么回事吗?

支持(0) 反对(0) moyuguixiong | 园豆:133 (初学一级) | 2018-01-05 18:04

@moyuguixiong:hibernateTemplateR.execute这个是在 tableNumber循环下做的吗?hibernate的缓存一般都是指数据在一条sql查询得到了,第二次查询时,不会再发sql。但是不会发错sql啊。。能给多点代码吗?我帮你调试一下!

支持(0) 反对(0) David5201 | 园豆:534 (小虾三级) | 2018-01-06 22:55

@David5201: 

这个是我调试的时候打印的sql语句,就是我通过变量生成表名,然后拼接的sql语句:

select * from tb_00 where TimeStamp>:startTimeStamp order by TimeStamp desc offset 0 rows fetch next 1 rows only

查看SQLQuery 变量,里面存的也是上述sql语句,但是调用SQLQuery 的list方法进行查询后,发送的sql语句,却是下面的,表名变了:

 

select

from
tb_01 
where
TimeStamp>? 
order by
TimeStamp desc offset 0 rows fetch next 1 rows only

支持(0) 反对(0) moyuguixiong | 园豆:133 (初学一级) | 2018-01-08 09:45

@David5201: 

而且不是每次都这样,而是当你正常调用方法查了tb_01后,再去查tb_00,sql偶尔会查tb_01,过一段时间,又正常的去查tb_00

支持(0) 反对(0) moyuguixiong | 园豆:133 (初学一级) | 2018-01-08 09:48

@moyuguixiong:不是每次都这样? 这个调用不会在多线程中吧?你的tableNumber是不是共享变量,出现了多线程的竟态?

支持(0) 反对(0) David5201 | 园豆:534 (小虾三级) | 2018-01-09 11:37
0

没见你传tableNumber啊,估计是tableNumber用的是上次的吧,你自己看一下tableNumber从哪来的,怎么回事

流年飞雨 | 园豆:1928 (小虾三级) | 2018-01-06 01:29

tableNumber是方法传进来的,select * from tb_00 where TimeStamp>:startTimeStamp order by TimeStamp desc offset 0 rows fetch next 1 rows only是真正的sql语句,是我打印出来的,这个是对的,但是真正查询发送的sql语句却是:select

from
tb_01 
where
TimeStamp>? 
order by
TimeStamp desc offset 0 rows fetch next 1 rows only,

tb_00变成了tb_01

支持(0) 反对(0) moyuguixiong | 园豆:133 (初学一级) | 2018-01-08 09:19

@moyuguixiong: 你是说,String sql = "select * from " + tableName + " where TimeStamp>:startTimeStamp"
+ andEndTime + " order by TimeStamp desc offset " + ((pageIndex - 1) * 10)
+ " rows fetch next " + pageSize + " rows only"; 这个变量,你debug的时候,看到的是tb_00表。但是console中show_sql显示的是tb_01的表吗?

支持(0) 反对(0) David5201 | 园豆:534 (小虾三级) | 2018-01-08 14:41

 做个小实验, 直接在你的方法你把tableNumber=2. 这个值不变!再看看

支持(0) 反对(0) David5201 | 园豆:534 (小虾三级) | 2018-01-08 14:42

@David5201: 不变测不出来,一直查询一个表,不会发生上述异常。当访问了其他表后,再访问1表,才会发生show_sql查询其他表的情况。而且是偶发性的查询其他表,我也是醉了。不知道是不是hibernate缓存了sql语句,我现在直接使用datasource获取connection,不用hibernate了

支持(0) 反对(0) moyuguixiong | 园豆:133 (初学一级) | 2018-01-09 09:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册