list方法会一次查出所有内容,放在list里和缓存中。再次查询同一内容仍然会去数据库重新查一遍,并刷新缓存。
iterate方法会一次查出所有内容的ID,等用到某个ID对应的内容时又会去根据主键查询内容,并放在缓存中,当再次查询相同的内容时不再查询数据库,直接调用session级缓存。
import java.util.Date;
import java.util.Iterator; import java.util.List;import org.hibernate.Session;
import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test;public class HibernateQLTest {
private static SessionFactory sf; @BeforeClass public static void beforeClass() { sf = new AnnotationConfiguration().configure().buildSessionFactory(); } @AfterClass public static void afterClass() { sf.close(); } @Test public void testSchemaExport() { new SchemaExport(new AnnotationConfiguration().configure()).create(false, true); } @Test public void testSave() { Session session = sf.openSession(); session.beginTransaction(); for(int i=0; i<10; i++) { Category c = new Category(); c.setName("c" + i); Topic t = new Topic(); t.setCategory(c); t.setTitle("t" + i); t.setCreateDate(new Date()); session.save(c); session.save(t); } session.getTransaction().commit(); session.close(); } //join fetch @Test public void testQueryList() { Session session = sf.openSession(); session.beginTransaction(); //List<Topic> topics = (List<Topic>)session.createCriteria(Topic.class).list(); List<Category> categories = (List<Category>)session.createQuery("from Category").list(); for(Category c : categories) { System.out.println(c.getName()); } List<Category> categories2 = (List<Category>)session.createQuery("from Category").list(); for(Category c : categories2) { System.out.println(c.getName()); } session.getTransaction().commit(); session.close(); } @Test public void testQueryIterate() { Session session = sf.openSession(); session.beginTransaction(); //List<Topic> topics = (List<Topic>)session.createCriteria(Topic.class).list(); Iterator<Category> categories = (Iterator<Category>)session.createQuery("from Category").iterate(); while(categories.hasNext()) { Category c = categories.next(); System.out.println(c.getName()); } Iterator<Category> categories2 = (Iterator<Category>)session.createQuery("from Category").iterate(); while(categories2.hasNext()) { Category c = categories2.next(); System.out.println(c.getName()); } session.getTransaction().commit(); session.close(); } public static void main(String[] args) { beforeClass(); } }