项目中大量用到了createSQLQuery, 用的倒是很爽, 后来想将查询结果缓存, 这下碰就到麻烦了,不过通过几次测试, 也顺利的缓存了结果, 赶快记下备忘, 也与大家分享.
实体类Customer.java
@SuppressWarnings("serial")
public class Customer implements java.io.Serializable{
private Integer id;
private String name;
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
二级缓存怎么配就不啰嗦了, 贴上测试代码
@Test
public void testSQLQuery(){
Session s = sf.openSession();
Transaction tr = s.beginTransaction();
SQLQuery q = s.createSQLQuery("select * from customers where id=1");
q.setCacheable(true);
Customer c= (Customer) q.addEntity(Customer.class).uniqueResult();
tr.commit();
s.close();
//上述代码会发出sql语句, 关闭session再开一个session, 以同样条件再次查询
s = sf.openSession();
tr = s.beginTransaction();
q = s.createSQLQuery("select * from customers where id=1");
q.setCacheable(true);
c= (Customer) q.addEntity(Customer.class).uniqueResult();
System.out.println(c.getName()); //再次查询, 没有发出sql,说明是从缓存中取的
tr.commit();
s.close();
}
之前一直报错, 角标越界:
java.lang.ArrayIndexOutOfBoundsException: 0
后来加上addEntity()后就不报错了,至于原因是什么,我也不太清楚,我想查询缓存存的是查询条件, 类缓存存的才是数据, 不加addEntity查出来的数据就无法进入类缓存, 当再次查询时,还是得根据条件再查数据库, 就失去了缓存的意义, 所以必须用addEntity来指定实体类???