HQL和Cretiaria应该都能实现。
本来准备用Cretiaria的,但是这个出现的比较早了。
public void fun1(){
//1加载配置
Configuration conf = new Configuration().configure();
//2 根据Configuration 配置信息创建 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 获得session
Session session = sf.openSession();
//打开事务
Transaction ts = session.beginTransaction();
//--------------------------------------------------------
//Criteria 查询 => Hibernate独创的面向对象的查询=> 无语句
Criteria criteria = session.createCriteria(User.class);
// 查找name属性值为tom的 记录
criteria.add(Restrictions.eq("name", "tom"));
//select * from t_user;
// list() 将查询执行,并返回结果(多行)
//List<User> list = criteria.list();
//System.out.println(list);
//返回一个查询结果
User u = (User) criteria.uniqueResult();
System.out.println(u);
//---------------------------------------------------------
//提交事务
ts.commit();
//关闭资源
session.close();
sf.close();
}
书上说,HQL语言也有两种实现方式:
1、使用定位参数
书上说不建议使用定位参数,因为这样做Hibernate将发出易损坏查询的警告。
但是,如果编程式构项复杂,可能使用定位参数是一个好的办法。 因地制宜吧。
Query query=session.createQuery("select i from Item i where i.name like ?1 and i.action> ?2");
query.setParameter(1, searching);
2、绑定命名参数
书上说,这个方法使得代码更加整洁、安全、更好的执行。
我就用了这个,感觉还行:
String hql="from Userinfo u where u.phone= :phone";
Query query=session.createQuery(hql).setParameter("phone", tphone);
Userinfo ui=(Userinfo) query.uniqueResult();