一、使用双向一对多,多对一的案例
util包不变、映射文件、配置文件不变
添加了一个实体(用于setResultTransformer):
package shuang.m2oo2m;
public class PersonClassInfo {
private String pname;
private String cname;
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
@Override
public String toString() {
return "PersonClassInfo [pname=" + pname + ", cname=" + cname + "]";
}
}
Main测试
package com.nf;
import java.util.List;
import java.util.Map;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import org.hibernate.transform.Transformers;
import shuang.m2oo2m.Person;
import shuang.m2oo2m.PersonClassInfo;
import util.HibernateUtil;
public class Main {
public static void main(String[] args) {
/*Criteria接口,单个模糊查询,组合类型模糊查询*/
queryByCriteria();
/*本地查询:即使用select语句查询*/
//nativeQuery() ;
/*本地查询:自己写的select查询语句:多表查询*/
//nativeQueryTransformer();
//批量添加、删除
batchProcess();
}
private static void template() {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session s = sf.openSession();
Transaction tx = s.beginTransaction();
tx.commit();
s.close();
sf.close();
}
// ********************过滤条件*************************
// 过滤条件值是固定的
private static void fixedWhereQuery() {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session s = sf.openSession();
Transaction tx = s.beginTransaction();
String hql = "select p from Person p where p.name='p111'";
Query q = s.createQuery(hql);
List<Person> list = q.list();
for (Person p : list) {
System.out.println(p);
}
tx.commit();
s.close();
sf.close();
}
//Criteria接口主要是针对查询条件进行的操作
//第一个Criteria接口案例-->like
private static void queryByCriteria() {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session s = sf.openSession();
Transaction tx = s.beginTransaction();
Criteria c = s.createCriteria(Person.class);
// 构造函数是受保护的,所以不能直接实例化
// Criterion guolv = new LikeExpression("name","abc");
/*
* 拓展:构造函数受保护的解决方案:
* (1)直接:在自己的类中写一个父类静态的方法、方便调用
* (2)间接:借用别人写好的工具类,里面写好的调用方法
* */
/*模糊查询:*/
Criterion guolv = Restrictions.like("name","p%");
c.add(guolv);
/*组合类型:Restrictions.and*/
/*
Criterion startWithP = Restrictions.like("name", "p%");
Criterion endWith5 = Restrictions.like("name", "%5");
Criterion guolv = Restrictions.and(startWithP,endWith5);
c.add(guolv);
*/
List<Person> result = c.list();
for(Person p: result) {
System.out.println(p);
}
tx.commit();
s.close();
sf.close();
}
/*本地查询:即使用select语句查询*/
private static void nativeQuery() {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session s = sf.openSession();
Transaction tx = s.beginTransaction();
NativeQuery q = s.createNativeQuery("select * from persons", Person.class);
List<Person> result = q.list();
for(Person p: result) {
System.out.println(p);
}
tx.commit();
s.close();
sf.close();
}
/*本地查询:自己写的select查询语句:多表查询*/
private static void nativeQueryTransformer() {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session s = sf.openSession();
Transaction tx = s.beginTransaction();
NativeQuery q = s
.createNativeQuery("select persons.name as pname,CLASSINFO.name as cname from persons inner join classInfo on persons.rci = CLASSINFO.cid");
q.setResultTransformer(Transformers.aliasToBean(PersonClassInfo.class));//为的是知道是哪个类
List<PersonClassInfo> result = q.list();
for(PersonClassInfo p: result) {
System.out.println(p);
}
tx.commit();
s.close();
sf.close();
}
/*批量添加删除
* batch批量的意思
* Hibernate 对update,delete操作支持比较好
* 而且hql的update,delete主要用来批量处理的
* 但是对insert操作,支持就有限制
* 不支持insert into xxx(id,name) values(1,'sss')
* 但其支持的是insert into xxx(id,name) select
*/
private static void batchProcess() {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session s = sf.openSession();
Transaction tx = s.beginTransaction();
String hql = "update Person p set p.name = p.name + 'abc' ";
Query q = s.createQuery(hql);
q.executeUpdate();
tx.commit();
s.close();
sf.close();
}
}