要是返回list,但是不是一个完整的对象的时候,用list来接收
再进行循环,讲object转换为object[]
configuration cfg = new Configuration().configure();
serviceRegisty sr = new ServiceRegiseryBuilder().
applySerttings(cfg.getProperties()).buildServiceRegistry();
sessionfactory factory = cfg.buildSessionFaceory(sr);
Session session = factory.getCurrentSesion();
session.beginTransaction();
//...code
session.getTransacion.commit();
//code部分
//保存一个对象
session.save(user);
//根据主键查找对象
session.get(User.class,1);
//修改对象
User user = session.get(User.class,1);
现在user是持久态
user.setUserName("tom");
//删除对象
User user = session.get(User.class,1);
//查询所有
Query query = session.createQuery("from User");
List list = query.findAll();
//在查询单个对象的时候有get和load
//如果找不到对象load会出现异常。。get则不会出现异常。。而且load是有延迟加载的
//save和persist都是讲持久化对象保存到数据库中的。
//save方法是将自由态的对象保存
//update方法将游离态的对象进行保存,将持久态进行更新
//saveOrUpdate将自有态进行保存,将持久态和游离态进行保存
//如果持久化对象在数据库中存在,使用merge操作时进行同步操作。如果对象在数据库不存在,merge对象则进
行保存操作,使用meger不会改变对象的状态。
HQL占位符
//给?进行赋值
string hql = "from User where userName = ?";;
Query query = session.createQuery(hql);
query.setString(0,"test");
//HQL引用占位符
string hql = "from User where userName = :name";
query.setParameter("name","test");
//HQL分页
query.setFirstResult(0);
query.setMaxResult(2);
criteria查询...其中有查询restrictions(条件)、projections(聚合函数)
//查询所有
criteria c = session.createCriteria(User.class);
list<User> list = c.list();
//where查询
c.add(Restrictions.eq("userName","test"));
restrictions.gt >
restrictions.lt <
ge >=
le <=
between 在什么中间
in
and
or
like
可以这样执行:
c.add(Restrictions.or(Restrictions.eq("userName", "James"),
Restrictions.eq("userName", "Alex")));
两个条件进行or操作。
//获取到唯一记录
c.uniqueResult();
//分组和统计,聚合函数
c.setProjection(Projections.sum("id"));
Projections.sum() sum()
Projections.avg() avg()平均数
Projections.count() count()
projections.distinct() 去除重复数据
projections.max()
projections.min()
projections.groupProperty 分组查询
//多个统计与分组
projectionList projectlist = Projects.projectionList();
projectlist.add(prjections.sum("id"))
projectlist.add(Project.min("id"))
c.setProection(projectionlist)
有多个分组统计的时候,利用Object[]来进行接收
//排序
c.addOrder(Order.desc("id"));
//使用原生sql查询
String sql= "select id,username,userpwdfrom t_user";
List list = session.createSQLQuery(sql).list();
String sql= "select id,username,userpwdfrom t_userwhere id = 2";
SQLQueryquery = session.createSQLQuery(sql).addEntity(User.class);//将几个参数的封装成一个实体类
User user = (User) query.uniqueResult()
//hibernate的配置
fetch="join"抓取策略了,配置了这个的话,该列在外建查询的时候会把这个对象给查询出来
cascade="delete"级联删除,在set中进行配置,当删除这条数据的时候,相关的外键约束数据也是被删除掉。
inverse="true"放弃关系维护,在set中使用,一般使one的一方放弃维护关系
//注解hibernate的配置
放弃关系维护:oneToMany(mappedBy="user");其中user是另一个实体类的属性名
抓取策略:fetch=FetchType.EAGER//在一端一般是用LAZY
级联删除:cascade={CascadeType.REMOVE}//一般在一端进行配置
缓存一下对象,防止session过期了获取不到了。Hibernate.initialize(u.getAddressSet());
//一对多配置
User
一:@oneToMany(mappedBy="user")//其中user是实体类中的属性名
Address
多:@ManyToOne
@joinColumn(name="user_id");其中user_id是在表address中的外键
//多对多配置
Student.java
@ManyToMany(mappedBy="students")//students是另外一端配置的属性名
Teacher.java
@ManyToMany
@JoinTable(name="t_student_teacher",
joinColumns=@JoinColumn(name="studentid"),
inverseJoinColumns=@JoinColumn(name="teacherid"))
publicSet<Student> getStudents() {
//t_student_teacher是中间表
//本身类在中间表的外键studentid
//另外一个类在中间表的外键teacherid
总结:
在一对多的时候:在一的一端配置oneToMany,并且放弃维护关系,一般还加上LAZY
在多对多的时候:在一端放弃维护关系,在另一端配置中间表,配置上本身和另外表的外键