Hibernate中set参数是从0开始,jpa中set参数是从1开始
二级缓存的使用(目的是可以跨EntityManager使用,而一级缓存只在一个EntityManager)
1.加入hibernate的lib/optional/ehcache中的全部,再导projectetc中的ehcache.xml配置文件
2.在persistence.xml中配置二级缓存和
3.在需要被二级缓存的实体类上加@Cacheable(true)
注意:这时只有在使用find等方法时才会有缓存,而使用query查询是没有缓存的需要设置
.setHint(QueryHints.HINT_CACHEABLE, true);且每新创建一个query都要设置
测试二级缓存
@Test public void testSecondCache() {//只有用到Manager的find方法时才会使用到二级缓存,若想使query也用缓存,参考下一个方法 Teacher t = manager.find(Teacher.class, 1); System.out.println(t.getName()); transaction.commit(); manager.close(); manager = factory.createEntityManager(); transaction = manager.getTransaction(); transaction.begin(); Teacher t2 = manager.find(Teacher.class, 1); System.out.println(t2.getName()); }
JPQL查询
1.createQuery()查询
@Test public void testQuery2() { String jpql = "SELECT new Teacher(id,name) FROM Teacher t WHERE t.id > ?"; Query query = manager.createQuery(jpql); // 从1开始的 query.setParameter(1, 1); List list = query.getResultList(); System.out.println(list);// 若SELECT id,name ,那么list中每一项是个数组;此时是Teacher }
2.createNamedQuery()查询
@Test public void testNamedQuery() {// 使用命名查询 Query query = manager.createNamedQuery("select"); query.setParameter(1, 1); Teacher t = (Teacher) query.getSingleResult(); System.out.println(t.getName()); }
Teacher类上要有@NamedQuery
@Cacheable(true) @NamedQuery(name = "select", query = "SELECT t FROM Teacher t WHERE t.id = 1")//虽然会报错但也可以写FROM Teacher t WHERE t.id = ?上面测试方法用的就是这句 @Table(name = "TEACHER") @Entity public class Teacher {
3.createNativeQuery()查询
@Test public void testNativeQuery() {// 代表使用本地数据库支持的sql语句 Query query = manager.createNativeQuery("SELECT name FROM teacher WHERE TEACHER_ID = ?"); System.out.println(query.setParameter(1, 3).getSingleResult()); }
使用查询缓存
若不使用查询缓存,在使用query时,即使语句、条件都相同,那么.getResultList();两次也会发两条sql。
@Test public void testTwoQuery() {//即使条件都相同也会发两次sql String jpql = "FROM Teacher t WHERE t.id = ?"; Query query = manager.createQuery(jpql); query.setParameter(1, 1); List list = query.getResultList(); List list22 = query.getResultList(); }
使用查询缓存了就只发一条
使用查询缓存的方式(每次新create的query都要.setHint(QueryHints.HINT_CACHEABLE, true)):
@Test public void testQueryCache() { String jpql = "FROM Teacher t WHERE t.id = ?"; Query query = manager.createQuery(jpql).setHint(QueryHints.HINT_CACHEABLE, true); //两次都必须加<property name="hibernate.cache.use_query_cache" value="true" /> query.setParameter(1, 1); List list = query.getResultList(); System.out.println(list.size()); query = manager.createQuery(jpql).setHint(QueryHints.HINT_CACHEABLE, true); //两次都必须加<property name="hibernate.cache.use_query_cache" value="true" /> query.setParameter(1, 1); List list2 = query.getResultList(); System.out.println(list2.size()); }