Hibernate查询有两种方式:
1.Native SQL 本地的原始方式sql查询,
2.HQL(Hibernate Query Language)hibernate的查询语句.
这里主要介绍HQL,HQL中含有EJBQL(JPQL 1.0)
HQL支持从每个实体类中查询数据,但要注意其查询时类名称要一致。
例 HQL List:
//创建并打开session Session session = sf.openSession(); session.beginTransaction();//开始事务 Query q = session.createQuery("from Category");//创建HQL查询对象,注意查询的是类名哦 List<Category> categories = (List<Category>)q.list();//因为没有条件,查询所有该类的在数据库的对象,并放到列表 for(Category c : categories) { System.out.println(c.getName()); } session.getTransaction().commit();//提交事务 session.close();//关闭session
起始你看了觉得和本地SQL没有多大区别,但是你可以看到下面的就要区别了:
public class MsgInfo { //VO DTO Value Object username p1 p2 UserInfo->User->DB private int id; private String cont; private String topicName; private String categoryName; public MsgInfo(int id, String cont, String topicName, String categoryName) { super(); this.id = id; this.cont = cont; this.topicName = topicName; this.categoryName = categoryName; } public String getTopicName() { return topicName; } public void setTopicName(String topicName) { this.topicName = topicName; } public String getCategoryName() { return categoryName; } public void setCategoryName(String categoryName) { this.categoryName = categoryName; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCont() { return cont; } public void setCont(String cont) { this.cont = cont; } }
测试
Session session = sf.openSession(); session.beginTransaction(); Query q = session.createQuery("select new suse.ly.domain.MsgInfo(m.id, m.cont, m.topic.title, m.topic.category.name) from Msg m"); for(Object o : q.list()) { MsgInfo m = (MsgInfo)o; System.out.println(m.getCont()); } session.getTransaction().commit(); session.close();
可以看到,在查询中可以将查询结果直接存储为一个对象,这是HQL的一大好处。
NativeSQL使用:
Session session = sf.openSession(); session.beginTransaction(); SQLQuery q = session.createSQLQuery("select * from category limit 2,4").addEntity(Category.class); List<Category> categories = (List<Category>)q.list(); for(Category c : categories) { System.out.println(c.getName()); } session.getTransaction().commit(); session.close();
另外要注意左右外连接的使用:左连接将左边的表连接取出来。,右连接将右边的表连接取出来。
以上内容学习自尚学堂..