⑴ hibernate怎么用查询
1:hibernate数据查询方式:有HQL方式,QBC方式,原生sql方式。HQL适合静态查询,QBC则适合较多的动态查询。
A:HQL方式,支持条件查询,连接查询,分页查询,分组查询,内置函数和自定义函数查询(SUN(),MIN(),MAX()),子查询,动态绑定参数查。
HQL语句定义如下:
String hql="from book";
Query query=session.createQuery(hql);
B:QBC方式,也就是QBC检索方式。QBC通过Session类创建Criteria实例,通过不同方法进行检索,实际上Criteria是用来装载查询条件的容器。QBC有很多条件函数,如:Resstictions.eq(),Resstictions.gt(),Resstictions.ge(),
Resstictions.le(),Resstictions.and(),Resstictions.or()等。
Criteria容器使用方法如下:
Criteria criteria=session.createCriteria(book.class);
criteria.add(Restrications.It("id",new Integer(4)));
List list=criteria.list();
C:原生SQL方式。不管是HQL还是QBC最终都要通过Hibernate来解析,把他们转换成SQL语句进行对数据库的操作。因为我们知道SQL可以在多平台之间使用。
使用原生SQL方式如下:
String sql="select {b.*} from book b"
SQLQuery squery=session.createSQLQuery(sql);
squery.addEntity("b",book.class);
List list=squery.list();
2:hibernate的关联查询
A:一对一关联:
B:一对多,多对一关联
C:多对多关联
最后,要学hibernate,平时要多动手,慢慢积累经验,成就感就会也大,这样才能学而不厌。祝你学习进步。
⑵ Hibernate HQL左连接+子查询怎么写
我要统计出 一个子查询结果集的记录条数(其中子查询是动态可变的)。例如:select count(*) from ( select o from TabCompany as o )你上面这个句子在数据库里面唤厅弯伏悔运行了没,一般在hibernate里面的sql语和闷句没有区别的。
⑶ SQL转HQL如何解决from后面子查询问题
Hibernate也有方法执行滚裂sql语句,像这种带子查询的语句hql好像执行不了,复杂我们一般都用sql语大滑闭让清句,Hibernate执行sql如下:
Query query = session.createSQLQuery(sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List list = query.list();
⑷ HQL怎么查子查询的条数
子查询是SQL语句中非常重要世悔的功能特性,它可以在SQL语句中利用另外一条SQL语句的查询结果,在Hibernate中HQL查询同样对子查询功能提供稿返衡了支持。如下面代码所示:
List list=session.createQuery(“from Customer c where 1>(select count(o) from c.orders o)”).list();
上面的程序查询订单数超过1的所有客户,因此和上面子查询HQL语句对应的SQL语句为:
Select * from Customer c where 1>(select count(o.id) from Order o where c.id=o.customer_ID);
如果子查询返回多条记录,则可以使用下面关键字:
all:表示子查询语句返回的所有记录
any:表示子查询语句返回的任意一条结果
some:与”any”等价
in:与”=any”等价
exists:表示子查询语句至少返回一条记录
例如:查询存在一条订单价格大于100的客户
From Customer c where 100>any(select o.price from c.orders o);
如果在子查询中操作集合,HQL提供键做了一组操纵集合的函数和属性:
size()函数和size属性:获得集合中元素的数量
minIndex()函数和minIndex属性:对于建立了索引的集合获得最小索引值(关于集合索引参考第一部分映射值类型集合)
minElement()函数和minElement属性:对于包含基本类型的元素集合,获得集合中值最小的元素
maxElement()函数和maxElement属性:对于包含基本类型元素的集合,获得集合中值最大的元素
element()函数:获得集合中所有元素
例如:查询订单数大于0的客户
From Customer c where size(c.orders)>0;或者From Customer c where c.orders.size>0;
以上HQL语句会生成类似如下的SQL语句:
Select * from customer c where 0>(select count(o.id) from order where o. customer_ID =c.id);
⑸ 怎么用Hibernate写SQL里的in式的子查询
我型慎姿孝镇写个简单的例子,楼主可以参考下public int getLogin(String username,String password)
{ String sql="卜绝select * from user_table where username=? and password=?";
SQLQuery query=getSession().createSQLQuery(sql).addEntity(UserTable.class);
query.setString(0,username);
query.setString(1,password);
return Integer.parseInt(query.uniqueResult().toString());
}
public static void main(String[] args) {
new UserTableDAO().getLogin("zhang","yuan");
}
⑹ hibernate访问oracle分页SQL语句rownum子查询问题
因为oracle它支持厅拆明扮告窗口函数row_number(),并且它御蚂的用法和在SQL server2005中的用法一样。
⑺ hibernate中,用HQL查询如何获取数据库中年龄字段最大的那条记录HQL语句怎么写
可以用子查询:
hql语句
"from User where age=(select max(age) from User) "
相应数碧的sql语句是
SELECT * FROM USER WHERE AGE=(SELECT MAX(AGE) FROM USER);
⑻ 【高额悬赏】关于Hibernate子查询以及Group by的一个问题
.....你要找每种componentName 的最大version.....直接敏羡用hql就悉拿亏行了:
String hql=“睁神from component t1 where t1.version =(select max(t2.version) from component t2 where t1.componentName=t2.componentName )”;
⑼ hibernate访问oracle分页SQL语句rownum子查询问题
第一个是从第几条开始,第二个是每页几条。
你看看你数据库里面的数据够不够分页,你这样只写两句就分页是不够的。
page = Paginator.showPage(, hql, paramValues, pageCurrent, pageSize);
/*
* 利用hql实现翻页
*/
public static Page showPage(PersistentBaseDao p, String hql,
Object[] paramValues, int pageCurrent, int pageSize) {
// 入口参数校验(无)
if (p == null) {
// log.debug("Paginator.p.hql is Empty");
}
if (hql.equals("") || hql == null) {
// log.debug("Paginator.showPage.hql is Empty");
}
if (p == null) {
// log.debug("Paginator.showPage.p is Empty");
}
PersistentBaseDao = (PersistentBaseDao) p;
// 如果当前页大于>总的页数,则让当前页等于总页数
int tempPageCount =0;
if (paramValues == null) {
tempPageCount = .getPageCount(hql, (Object[]) null, pageSize);
} else {
tempPageCount= .getPageCount(hql, paramValues, pageSize);
}
if (pageCurrent > tempPageCount) {
pageCurrent = tempPageCount;
}
// 如果当前页大于<1,则让当前页等于1
if (pageCurrent < 1) {
pageCurrent = 1;
}
// 调用.serarch()方法
if (paramValues == null) {
page = .search(hql, pageCurrent, pageSize);
} else {
page = .search(hql, paramValues, pageCurrent, pageSize);
}
// 为page对象设置当前页的属性
page.setPageCurrent(pageCurrent);
// 将page对象放在request对象中
return page;
}
/*
* 利用List实现翻页
*/
@SuppressWarnings("unchecked")
public static Page showPage(List list, int pageCurrent, int pageSize) {
// 入口参数校验(无)
if (list.isEmpty()) {
// log.debug("Paginator.showPage.list is Empty");
}
// 如果当前页大于>总的页数,则让当前页等于总页数
if (pageCurrent > page.getPageCount()) {
pageCurrent = page.getPageCount();
}
// 如果当前页大于<1,则让当前页等于1
if (pageCurrent < 1) {
pageCurrent = 1;
}
List ls = new ArrayList();
// 根据得到的list转化为page对象
if (list.size() % pageSize == 0) {
page.setPageCount((list.size() / pageSize));
} else {
page.setPageCount((list.size() / pageSize) + 1);
}
page.setPageCurrent(pageCurrent);
page.setRecordCound(list.size());
int stag = (pageCurrent - 1) * pageSize;
int etag = pageCurrent * pageSize;
for (int i = stag; i < list.size() && i < etag; i++) {
ls.add(list.get(i));
}
page.setDataList(ls);
return page;
}
⑽ hibernate的关联子查询的问题
在hibernate中设置cascade的属性为true,这表示级联操作,当查乱兆询哗友租多一张表的时候,可以查询与告察此表有关联的表。