zz http://blog.csdn.net/lihua2915/archive/2011/03/30/6289323.aspx
检索单个对象
Query和Criteria都提供了返回单个对象的方法uniqueResult().
先调用setMaxResult(1)方法,把最大检索数目设为1,在调用uniqueResult()方法。
Hx hx = (Hx)session.createQuery("from Hx")
.setMaxResults(1)
.uniqueResult();
Hx hx = (Hx)session.createCriteria(Hx.class)
.addOrder(Order.asc("name"))
.setMaxResults(1)
.uniqueResult();
与对象属性绑定
Hx hx = new Hx();
hx.setAge("33");
List list = session.createQuery("from Hx as c where c.age=:age")
.setProperties(hx)
.list();
SQL内连接
内连接就是传统的连接操作,用join连接关联表,on作为连接条件,where指定其他限定条件的查询
如:
select hx.name,hx.age,hxhome.home from hx join hxhome on hx.id=hxhome.hxid
SQL左外连接
在结果表中包含第一个表中满足的所有纪录,如果是在连接条件上匹配纪录,则第二个表返回相应的值,否则第二个表返回空值。
如:
select hx.name,hx.age,hxhome.home from hx left join hxhome on hx.id=hxhome.hxid
SQL右外连接
在结果表中包含第二个表中满足的所有纪录,如果是在连接条件上匹配纪录,则第一个表返回相应的值,否则第一个表返回空值。
如:
select hx.name,hx.age,hxhome.home from hx right outer join hxhome on hx.id=hxhome.hxid
Hibernate中各种连接
迫切左外连接
以下两种检索方式是等价的,它们都能同时迫切左外连接类B和类C:
//HQL迫切左外连接检索方式
from A a left join fetch a.b b left join fetch a.c c where b is not
null and c is not null
//QBC迫切左外连接检索方式
List result=session.createCriteria(A.class)
.setFetchMode("this.b",FetchMode.EAGER)
.setFetchMode("this.c",FetchMode.EAGER)
.add(Expression.isNotNull("this.b"))
.add(Expression.isNotNull("this.c"))
.list();
迫切左外连接
HQL:
Session session = HibernateSessionFactory.getSession();
List list = session.createQuery("from Hxhome c left join fetch c.hx h") .list();
for(int i=0;i<list.size();i++)
{
Hxhome hh = (Hxhome)list.get(i);
System.out.println("homeid="+hh.getHxid());
System.out.println("home="+hh.getHome());
System.out.println("hxname="+hh.getHx().getName());
}
迫切左外连接
QBC:
List list = session.createCriteria(Hxhome.class)
.setFetchMode("hx", FetchMode.EAGER)
.add(Expression.like("home","h%"))
.list();
for(int i=0;i<list.size();i++)
{
Hxhome hh = (Hxhome)list.get(i);
System.out.println("homeid="+hh.getHxid());
System.out.println("home="+hh.getHome());
System.out.println("hxname="+hh.getHx().getName());
}
QBC中的FetchMode
FetchMode.DEFAULT:表示采用映射文件中配置的检索策略
FetchMode.EAGER:覆盖映射文件中配置的检索策略,在程序中显示指定迫切左外连接检索策略
FetchMode.LAZY:覆盖映射文件中配置的检索策略,在程序中显示指定延迟检索策略
左外连接
HQL:
List list = session.createQuery("from Hxhome c left join c.hx ")
.list();
for(int i=0;i<list.size();i++)
{
Object[] zmx = (Object[])list.get(i);
Hx hx = (Hx)zmx[1];
Hxhome hh = (Hxhome)zmx[0];
System.out.println("hx="+hx.getName()+"---------hh="+hh.getHome());
}
左外连接
QBC不支持左外连接
内连接
HQL:
List list = session.createQuery("from Hxhome c join c.hx ")
.list();
for(int i=0;i<list.size();i++)
{
Object[] zmx = (Object[])list.get(i);
Hx hx = (Hx)zmx[1];
Hxhome hh = (Hxhome)zmx[0];
System.out.println("hx="+hx.getName()+"---------hh="+hh.getHome());
}
QBC:
List list =session.createCriteria(Hxhome.class)
.createAlias("hx", "h")
.add(Expression.like("home","h%"))
.list();
for(Iterator it=list.iterator();it.hasNext();)
{
Map map = (Map)it.next();
Hxhome hh = (Hxhome)map.get("this");
Hx hx = (Hx)map.get("h");
------------------------
}
右外连接
HQL:
List list = session.createQuery("from Hxhome c right join c.hx h")
.list();
for(Iterator it=list.iterator();it.hasNext();)
{
Object[] zmx = (Object[])it.next();
Hxhome hh = (Hxhome)zmx[0];
Hx hx = (Hx)zmx[1];
System.out.print(hh.getHome());
System.out.println(hx.getName());
}
右外连接
QBC:
不支持右外连接
HQL支持各种的连接查询
1、默认情况
from Hx c where c.name like ‘h%’
2、迫切左外连接
from Hx c left join fetch c.hxhome where c.name like ‘h%’
3、左连接
from Hx c left join c.hxhome where c.name like ‘h%’
4、迫切内连接
from Hx c join fetch c.hxhome where c.name like ‘h%’
5、内连接
from Hx c join c.hxhome where c.name like ‘h%
6、右外连接
from Hx c right join c.hxhome where c.name like ‘h%
报表查询
1、投影查询
2、使用聚集函数
3、分组查询
投影查询
投影查询:指查询结果仅包含部分实体或实体的部分属性,通过select关键字来实现。
select关键字用于选择对象的部分属性,例如:
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
Iterator it = session.createQuery("select c.name,c.age,h.home from Hx c join c.homes h where c.id>0 ")
.list()
.iterator();
while(it.hasNext())
{
Object[] row = (Object[])it.next();
String age = (String)row[1];
String home = (String)row[2];
System.out.println("|age="+age+"|home="+home);
}
tx.commit();
session.close();
投影查询
过滤结果中的重复数据—使用set
Iterator it = session.createQuery("select c.name from Hx c")
.iterate();
Set set = new HashSet();
while(it.hasNext())
{
String it1 = set.iterator();
while(it1.hasNext())
{
String name1 = (String)it1.next();
System.out.println("name1="+name1);
}
投影查询
也可以使用distinct关键字来过滤重复记录
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
Iterator it = session.createQuery("select distinct c.name from Hx c")
.iterate();
while(it.hasNext())
{
String c.ID,c.NAME,o.ORDER_NUMBER
from CUSTOMERS c inner join ORDERS o
on c.ID=o.CUSTOMER_ID where o.ORDER_NUMBER like 'T%';
以上查询语句的查询结果如下:
+----+------+--------------+
| ID | NAME | ORDER_NUMBER |
+----+------+--------------+
| 1 | Tom | Tom_Order001 |
| 1 | Tom | Tom_Order002 |
| 1 | Tom | Tom_Order003 |
+----+------+--------------+
Query的list()方法返回的集合中包含三个对象数组类型的元素,每个对象数组代表以上查询结果的一条记录。
投影查询
使用聚集函数
在HQL中可以调用
Count:统计函数
Min:求最小值函数
Max:求最大值函数
Sum:求和函数
Avg:求平均数函数
Count:统计函数
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
Integer count = (Integer)session.createQuery("select count(*) from Hx")
.uniqueResult();
System.out.print(count);
tx.commit();
session.close();
Avg:求平均数函数
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
Float count = (Float)session.createQuery("select avg(c.id) from Hx c")
.uniqueResult();
System.out.print(count);
tx.commit();
session.close();
Sum:求和函数
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
Integer count = (Integer)session.createQuery("select sum(c.id) from Hx c")
.uniqueResult();
System.out.print(count);
tx.commit();
session.close();
Min:求最小值函数 Max:求最大值函数
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
Object[] count = (Object[])session.createQuery("select min(c.age),max(c.age) from Hx c")
.uniqueResult();
String min = (String)count[0];
String max = (String)count[1];
System.out.print("min="+min+"|max="+max);
tx.commit();
session.close();
分组查询
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
Iterator it = session.createQuery("select c.name,count(c) from Hx c group by c.name")
.iterate();
while(it.hasNext())
{
Object[] oc = (Object[])it.next();
String count = (Integer)oc[1];
System.out.println(name+":"+count);
}
tx.commit();
session.close();
分享到:
相关推荐
除了基本的查询外,Hibernate还支持各种聚合函数,如平均值、计数等。 #### 平均值(Average) ```java Criteria criteria = session.createCriteria(User.class); criteria.setProjection(Projections.avg("age"))...
### Hibernate多表联合查询详解 #### 一、引言 在实际项目开发中,我们经常需要处理复杂的数据库查询,特别是涉及到多个表之间的关联查询。Hibernate作为一款流行的Java持久层框架,提供了一种非常便捷的方式来处理...
除了基础的查询,Hibernate还支持连接查询、子查询、聚合函数等高级功能。例如,如果你需要根据用户的年龄进行分组并计算每个年龄段的用户数量,可以这样写: ```java String hql = "select age, count(*) from ...
HQL支持各种复杂的查询,如连接查询、分组查询、子查询等。例如,我们可以用以下HQL语句查询所有未删除的用户: ```java String hql = "from User u where u.deleted = false"; Query<User> query = session....
例如,可以创建一个 Criteria 对象,然后添加各种限制条件、排序和分组,最后执行查询。对于多表连接,Criteria API 可以通过 JoinType 类型的 JOIN 方法实现,如 INNER JOIN、LEFT JOIN 等。 **分页查询** 在大...
HQL支持复杂的查询,如分组、排序、联接、子查询等,且能自动处理对象关系映射,提高了代码的可读性和可维护性。 二、Criteria API Criteria API是Hibernate提供的另一种查询方式,它提供了一种面向对象的查询接口...
HQL支持各种操作,如选择、投影、连接、分组、排序等,还可以进行复杂的条件查询和子查询。例如,以下是一个简单的HQL查询示例,用于获取所有年龄大于30岁的用户: ```java String hql = "FROM User WHERE age > 30...
它支持连接(inner/outer/full joins)、投影、聚合、分组、排序、子查询以及SQL函数调用。 2. 简单HQL示例: ```java Query query = session.createQuery("from User user where user.name like 'J%'"); List...
在实际应用中,你还可以结合Hibernate的 Criteria 查询、Criteria API 或者 JPA 的 Query API 来实现更复杂的聚合查询,如带条件的聚合、子查询等。 总之,Hibernate提供的聚合函数使得在Java应用程序中进行数据...
这个案例是根据分组查询,并且得到每组的条数,不懂得可以q我:1710086675,欢迎认识更多新朋友
例如,你可以创建一个`Criteria`对象,然后添加各种限制条件,如属性比较、分组、排序等,最后调用`list()`方法执行查询。 总的来说,Hibernate的查询操作是灵活且强大的,无论你是使用HQL还是Criteria API,都能...
- **分组查询**:根据一个或多个属性对结果进行分组。 - **排序查询**:通过ORDER BY子句对结果进行排序。 - **关联查询**:处理一对多、一对一、多对多等关联关系的查询。 4. **条件查询** - 使用WHERE子句...
HQL支持各种条件查询,如等于、不等于、大于、小于等操作符: ```java query = session.createQuery("from Customer c where c.name = 'John'"); customers = query.list(); ``` 上述代码将返回所有名为'John'的...
本节我们将深入探讨Hibernate中的HQL(Hibernate Query Language)查询,这是一种专为Hibernate设计的面向对象的查询语言,类似于SQL但更贴近于Java程序员的思维。 首先,HQL查询的基本语法结构与SQL类似,但对象化...
3. **Criteria查询的构建**:包括选择实体(Select),指定查询的根实体(Root Criteria),添加限制条件(Restrictions),排序(Order),分组(Group By)以及聚合函数(Projections)等。 4. **Join操作**:在...
6. **HQL(Hibernate Query Language)**:类似于SQL,但专为ORM设计,HQL允许开发者以面向对象的方式执行数据库查询,支持复杂的查询操作,如关联查询、分组、排序等。 7. **事务管理**:在数据库操作中,事务的...
### Hibernate中HQL语句查询学习笔记 #### HQL基础 **HQL**(Hibernate Query Language)是Hibernate框架推荐使用的查询语言,它提供了一种面向对象的方式来查询数据库,支持多种复杂的查询操作,如继承、多态及...
`Hibernate HQL.ppt`则可能深入讲解HQL的使用,包括如何进行条件查询、分组、排序、联接操作等。此外,可能会涉及到Criteria API,这是另一种在Hibernate中进行动态查询的方式,提供了更加面向对象的查询接口。 总...