1、所谓1+N的问题,意思是说我们希望查询一张表里面的数据,但是在执行sql语句时,会发生多条和另外对应表的sql语句。这样会降低数据库执行效率和性能。
2.解决1+N的问题的三种方式如下:
//使用session.creatQuery的方式,在对应的类中设置@ManyToOne(fetch=FetchType.LAZY)
@Test
public void testSelect1Topic() {
Session session = sf.openSession();
session.beginTransaction();
//List<Topic> t =(List<Topic>) session.createCriteria(Topic.class).list();
//
List<Topic> t =(List<Topic>) session.createQuery("from Topic").list();
for (Topic to : t) {
System.out.println(to.getId() + "-" + to.getTitle());
}
session.getTransaction().commit();
session.close();
}
//在对应的类中设置@BatchSize中size的属性的值
@Test
public void testSelect2Topic() {
Session session = sf.openSession();
session.beginTransaction();
//List<Topic> t =(List<Topic>) session.createCriteria(Topic.class).list();
//
List<Topic> t =(List<Topic>) session.createQuery("from Topic").list();
for (Topic to : t) {
System.out.println(to.getId() + "-" + to.getTitle());
}
session.getTransaction().commit();
session.close();
}
//使用join fetch
@Test
public void testSelect3Topic() {
Session session = sf.openSession();
session.beginTransaction();
//List <Topic> t =(List<Topic>) session.createCriteria(Topic.class).list();
List<Topic> t =(List<Topic>) session.createQuery("from Topic t left join fetch t.category c").list();
for (Topic to : t) {
System.out.println(to.getId() + "-" + to.getTitle());
}
session.getTransaction().commit();
session.close();
}