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();
另外要注意左右外连接的使用:左连接将左边的表连接取出来。,右连接将右边的表连接取出来。
以上内容学习自尚学堂..