Hibernate

[color=violet]1.Query 的使用方法[/color]
 public List<User> findUserByName(String name)
{
String hql = "from User u where u.name like :xxx";
Session s = HibernateSessionFactory.getSession();
Query q = s.createQuery(hql);
q.setString("xxx", "%" + name + "%");
return q.list();//放在Object[]中,没做投影的话,不放在Object[]中
//也可以写成一行return HibernateSessionFactory.getSession().createQuery
("from User u where u.name like :xxx").setString("xxx", "%" + name + "%").list();
}



[color=violet]2.Criteria 的使用方法[/color]
Query By Criteria(标准)
Expression 3.0以前名字
Restrictions 3.1后名字-- 添加一些约束

 public List<User> findUserByName(String name)
{
Session s = HibernateSessionFactory.getSession();
// from User u
Criteria c = s.createCriteria(User.class);
//只投影一个列的话 c.setProjection(Projections.property("name");
//select u.name,u.birth from User u
c.setProjection(Projections.projectionList().add(Projections.property("name"))
.add(Projections.property("birth")));
//select u.name,u.birth from User u where u.name like '%'+name+'%';
c.add(Restrictions.like("name", "%" + name + "%"));
c.add(Restrictions.eq("birth","1980-01-01"));//连续调用时and关系
//c.add(Restrictions.or(Restrictions.like("name", "%" + name + "%"),Restrictions
//.eq("birth","1980-01-01")));
return c.list();//放在Object[]中
}

1.通过使用createCriteria(XXX.class)来确定查询哪一个对象。
2.通过Criteria下的add函数来添加查询条件。使用Restrictions工具类来指定条件。
连续调用add函数,条件之间是and关系。
若使用or关系,需要通过Restrictions.or()来完成。
3.在用Criteria接口查询的时候如何做投影操作。
   Criteria c = s.createCriteria(XXX.class);
c.setProjection(Projections.propertyList().add(Projections.property("name")).add().add()...);
//添加where
c.add(Restrictions.eq());
c.list();//放在Object[]中


[color=violet]3.QBE(Query By Example)通过模板查询[/color]
 Customer c=new Customer();
c.setAge(99);
c.setName(“zhangsan”);
List result=session.createCriteria(Customer.class).add(Example.create(c)).list();


QBE只支持=和like,不支持or > <之类的查询

[color=violet]4.SQL检索方式[/color]
  String sql="select * from User c where c.NAME like :name"
Query q=session.createSQLQuery(sql).addEntity(User.class);
q.setString(“name”,”%zhang%”);
q.setString(1,”%zhang%”);
List result=q.list();//加了addEntity(User.class),就把结果放在User对象中,不加放在Object[]中


[color=violet]5.其它的参数绑定方法[/color]
[color=brown] Ⅰ.使用setEntity方法绑定对象类型的参数:[/color]
session.createQuery(“from Order o where o.customer=:customer”).setEntity(“customer”,customer).list();

[color=brown] Ⅱ.使用setParameter方法绑定任意类型的参数:[/color]
	[code="java"]Query q=session.createQuery
(“from Order o where o.customer=:customer”+”and o.orderNumber like :orderNumber”);
q.setParameter(“customer”,customer,Hibernate.entity(Customer.class));

q.setParameter(“orderNumber”,orderNumber,Hibernate.STRING);[/code]
[color=brown] Ⅲ.使用setProperties方法绑定参数:[/color]
Customer c=new Customer();
c.setName(“zhangsan”);
c.setAge(33);
Property
Query q=session.createQuery(“from Customer c where c.name=:name”+”and c.age=:age”);
q.setProperties(c);


[color=violet]6.在映射文件中定义命名查询语句[/color]
  <hibernate-mapping>
<class name=“mypack.Customer” table=“CUSTOMERS”>
</class>
<query name=“aFind”><![CDATA[
from Customer c where c.name like :name]]></query>
</hibernate-mapping>

Query q=session.getNamedQuery(“aFind”);
q.setString(“name”,name);
List result=q.list();


[color=violet]7.比较运算[/color]
[color=olive]检索年龄大于18的Customer:[/color]
Criteria c=session.createCriteria(Customer.class);
c.add(Expression.gt(“age”,18));


[color=olive] 检索年龄不等于18的Customer:[/color]
 c.add(Expression.not(Expression.eq(“age”,new Integer(18))));


[color=olive]检索姓名为空的Customer:[/color]
c.add(Expression.isNull(“name”));


[color=olive]检索不属于任何客户的订单:[/color]
c.add(Expression.isNull(“customer”));


[color=olive]检索名字为zhangsan的客户:[/color]
c.add(Expression.eq(“name”,”zhangsan”).ignoreCase());


[color=violet]8.范围运算[/color]
[color=olive]检索名字为zhangsan、lisi、wangwu的客户:[/color]
String[] names={“Tom”,”Mike”,”Jack”};
c.add(Expression.in(“name”,names));

[color=olive]检索年龄在18到30之间的客户:[/color]
[quote]c.add(Expression.between(“age”,new Integer(18),new Integer(30));[/quote]

[color=olive]检索年龄不在18到30的客户:[/color]
c.add(Expression.not(Expression.between(“age”,new Integer(18),new Integer(30)));


[color=violet]9.Hibernate应用中Java对象的状态[/color]
临时状态(Transient):也叫瞬时状态。new出来的对象,没有被持久化处理,不处于Session缓存中的对象

持久化状态(Persistent):已经被持久化,加入到Session的缓存中

游离状态(Detached):也叫脱管状态。已经被持久化,但是不处在Session缓存中

[color=olive]⑴临时对象的特征:[/color]
不处于Session缓存中(不被任何一个Session实例关联)

在数据库中没有对应的记录

进入临时状态的条件:
new一个Java对象,他处于临时状态,不和数据库任何记录关联
Session的delete方法能够是一个持久化对象或游离对象转变为临时状态;对于游离对象,
delete方法从数据库中删除与它对应的记录;对于持久化对象,delete方法从数据库中删除与它对应的记录,
并把它从session缓存中删除

[color=olive]⑵持久化对象的特征:[/color]
在一个Session实例的缓存中(与一个Session关联)

持久化对象和数据库中的相关记录对应

Session清理缓存时,会根据持久化对象的属性变化,来同步更新数据库

进入持久化状态的条件
session的save方法
session的load和get方法返回的对象都是处于持久化状态
session的find方法返回的List中存在的对象都是处于持久化状态
session的update、saveOrUpdate和lock方法使得游离对象转换为持久化状态
当一个持久化对象关联一个临时对象,在允许级联保存的情况下,Session在清理缓存时把这个对象也转
变为持久化状态

[color=olive]⑶游离对象的特征:[/color]
不再位于session缓存中(游离对象不被Session关联)
游离对象是从持久化对象转变过来的,因此在数据库中可能还存在与其对应的记录
游离对象与临时对象的区别在于:前者是由持久化对象转变过来的,前者在数据库中还存在与之对应的记录,
而后者在数据库中没有与之对应的记录;
进入游离状态的条件
当调用session的close方法的时候,session缓存被清空,缓存中的所有持久化对象都变为游离状态。如果此时再没
有其它变量引用的时候,其生命周期结束
session的evict方法能够从缓存中删除一个持久化对象,使它变为游离状态。如果内存中存在大量的对象的时候,
可以通过这个方法来删除缓存中的对象(不建议使用这个方法,还是使用查询的方法和常规方法来处理对象在内存
中的深度)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值