- 浏览: 253167 次
- 性别:
- 来自: 湖南
文章分类
- 全部博客 (194)
- java (23)
- 数据结构和算法 (5)
- oracle (7)
- sql server (1)
- mysql (5)
- Ajax (5)
- JSTL (7)
- jsp (20)
- 组件 (11)
- C++可视化 (0)
- javascript (14)
- c/c++ (0)
- XML (6)
- 只是扩宽 (0)
- 设计模式 (3)
- 正则表达式 (3)
- 心情和感悟 (4)
- ACM (3)
- HTML/css (9)
- 软件破解 (2)
- spring (1)
- struts (15)
- hibernate (10)
- Servlet (2)
- sql (2)
- 面试题 (1)
- struts2 (22)
- Unix/Linux (0)
- javamail (1)
- svn (1)
- 异常 (3)
- EJB (3)
- jquery (2)
- android (1)
最新评论
-
lianlupengUestc:
From my testing (Struts2 versio ...
struts2 注解 -
yulongxiang:
非常感谢!!!!!!!
使用动态ActionForm(转)
检索单个对象
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();
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/niubtangno1/archive/2007/08/15/1745140.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();
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/niubtangno1/archive/2007/08/15/1745140.aspx
发表评论
-
hql查找最大值的语句
2011-03-30 00:33 15151.取子串的函数,SUBSTRING(s,offset,len ... -
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are
2011-03-08 23:56 3318可能是因为在配置事务传播特性的时候,将这种操作配置为了read ... -
openSessionInViewFilter作用
2011-03-04 00:54 841OpenSessionInViewFilter的主要功能是用来 ... -
<prop key="current_session_context_class">thread</prop>作用
2011-03-04 00:42 2908sessionFactory.getCurrentSessio ... -
调用getHibernateTemplate.save()方法的只增加id没插入数据的解决方法
2011-03-03 15:50 1024是因为事务没有提交 在hibernate.cfg.xml文件中 ... -
hibernate 模拟实现
2010-10-05 21:54 1135StuentTest.java import com.h ... -
hibernate需要到如的包
2010-10-05 12:22 774hibernate需要到如的包 hibernate2.jar ... -
hibernate--报错
2010-09-23 00:02 7001。Exception in thread "mai ... -
我的第一个hibernate程序
2010-09-18 16:14 877Student.java package com.hugui ...
相关推荐
汇集了hql语句中大部分常用的函数 ABS(n) 取绝对值数学函数 数学函数 JPAQL HQL ABS(column_name[数字类型对象属性])
### HQL常用函数大全 #### 一、关系运算 在Hive SQL (HQL) 中,关系运算是处理数据查询的基础。以下列出的关系运算符帮助用户进行数据比对。 ##### 1. 等值比较 (`=`) **语法**:`A = B` **操作类型**:所有...
2. **SUBSTRING(s, offset, length)**:此函数用于提取字符串的一部分。参数`offset`表示从哪个位置开始提取,`length`表示提取多少个字符。例如,`SUBSTRING('Hello World', 7, 5)`将返回`'World'`。 3. **TRIM...
当只需要查询部分字段时,可以通过HQL指定这些字段: ```java String hql = "select u.name from com.mypack.User4 u"; Query query = session.createQuery(hql); List names = query.list(); ``` 遍历获取到的名字...
总结来说,HQL是Hibernate中进行对象查询的关键部分,它简化了与数据库的交互,让开发者可以更加专注于业务逻辑而不是底层的数据库操作。通过学习和熟练掌握HQL,可以提高开发效率,使代码更加易于理解和维护。
HQL允许在查询中嵌套查询,子查询可以作为查询条件或者返回结果的一部分。比如,找出年龄大于平均年龄的用户: ```java String hql = "from User where age > (select avg(age) from User)"; ``` 六、HQL关联查询 ...
而HQL作为Hibernate的核心组成部分,它的掌握对于Java开发者来说至关重要。 1. **HQL简介** HQL是面向对象的查询语言,与SQL不同的是,它操作的对象是Java实体类而不是数据库表。它将数据库表和Java类之间的映射...
HQL查询语句结构通常包括以下几个部分:`SELECT`, `FROM`, `WHERE`, `GROUP BY`, `HAVING`, `ORDER BY`。这些关键字与SQL中的用法类似,但HQL中的对象和属性是基于Java类和它们的成员。 例如,假设我们有一个`...
在IT行业中,数据库管理和持久化框架是至关重要的组成部分。Hibernate作为一个优秀的Java ORM(对象关系映射)框架,极大地简化了Java应用与数据库之间的交互。Oracle则作为一款强大的关系型数据库管理系统,广泛...
HQL支持多种聚合函数,如avg(平均值)、count(计数)、max(最大值)、min(最小值)、sum(总和)等。例如,统计Person表中的记录总数: ```java select count(*) from Person ``` ##### 4. 条件筛选(WHERE子句...
HQL支持类名、属性名作为查询语句的一部分,使得查询更接近于面向对象的思维方式,而不是直接处理表名和列名。这种特性使得HQL在ORM(Object-Relational Mapping)场景下非常有用,因为它可以保持代码的整洁和可维护...
总结来说,Hql作为Hibernate的一部分,提供了一种强大的、面向对象的查询方式,它简化了与数据库交互的过程,提高了开发效率。理解并熟练掌握Hql的使用,对于进行高效的ORM编程至关重要。在实际应用中,结合QBC和...
HQL还支持统计函数,如: - `count()`:统计匹配条件的记录数。 - `min()`:找出最小值。 - `max()`:找出最大值。 - `sum()`:计算总和。 - `avg()`:计算平均值。 示例: ```sql Query query = session....
以下将详细介绍HQL语句的几个关键部分: 1. **from 子句**:这是HQL查询的起点,用于指定要查询的持久化类。例如,`from Person as p`表示从`Person`类中选择所有实例。`as p`是别名,方便后续引用。 2. **select ...
**Hibernate HQL 全攻略** ...以上内容覆盖了HQL的大部分核心特性,通过熟练掌握这些知识点,可以高效地在Hibernate中进行数据查询和操作。学习并实践这些HQL技巧,将极大地提升你在Java持久层开发中的能力。
在Hibernate中,实体类的主键(ID)生成策略是关键部分,它决定了如何为新记录分配唯一标识。以下是几种常见的ID生成策略: - ** Assigned **:主键由应用程序负责生成。 - ** Identity **:适用于支持自动递增字段...
4. **使用统计函数**:HQL支持SQL中的统计函数,如`count()`, `min()`, `max()`, `avg()`, `sum()`等。例如,`"select count(*), min(user.age) from User as user"`,可用于获取用户数量和最小年龄等统计数据。 ##...
另外,可以在 `SELECT` 子句中使用统计函数,例如 `COUNT(*)`, `MIN()`, `MAX()` 等,也可以使用 `DISTINCT` 关键字来去除重复记录: ```java String hql = "select distinct user.name from TUser as user"; ``` ...
2. **依赖关系识别**:通过对HQL的分析,识别出各个部分依赖的表、视图或函数,这些依赖构成了数据血缘的基础。 3. **血缘图构建**:将解析出的依赖关系可视化为图形,便于用户直观地查看数据流经的路径。这种图...