Hibernate有几种查询方法

 我来答
herox_hu
推荐于2017-09-27 · TA获得超过776个赞
知道小有建树答主
回答量:1122
采纳率:0%
帮助的人:318万
展开全部
转录:
从点到面,讲讲hibernate查询的6种方法。分别是HQL查询
,对象化查询Criteria方法,动态查询DetachedCriteria,例子查询,sql查询,命名查询。
如果单纯的使用hibernate查询数据库只需要懂其中的一项就可以完成想要实现的一般功能,但是
从一个点,让我们掌握6中方法,则提供了更多选择。每一种方法都有其适用的情况与前提。
HQL查询
HQL是hibernate自己的一套查询语言,于SQL语法不同,具有跨数据库的优点。示例代码:

static void query(String name){
Session s=null;
try{
s=HibernateUtil.getSession();

//from后面是对象,不是表名
String hql="from Admin as admin where admin.aname=:name";//使用命名参数,推荐使用,易读。
Query query=s.createQuery(hql);
query.setString("name", name);

List<Admin> list=query.list();

for(Admin admin:list){
System.out.println(admin.getAname());
}
}finally{
if(s!=null)
s.close();
}
}

适用情况:常用方法,比较传统,类似jdbc。缺点:新的查询语言,适用面有限,仅适用于Hibernate框架。
对象化查询Criteria方法:

static void cri(String name,String password){
Session s=null;
try{
s=HibernateUtil.getSession();

Criteria c=s.createCriteria(Admin.class);
c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或
c.add(Restrictions.eq("apassword", password));

List<Admin> list=c.list();
for(Admin admin:list){
System.out.println(admin.getAname());
}
}finally{
if(s!=null)
s.close();
}
}

适用情况:面向对象操作,革新了以前的数据库操作方式,易读。缺点:适用面较HQL有限。
动态分离查询DetachedCriteria

static List dc(DetachedCriteria dc) {

Session s = HibernateUtil.getSession();
Criteria c = dc.getExecutableCriteria(s);
List rs = c.list();
s.close();
return rs;
}

DetachedCriteria dc = DetachedCriteria.forClass(User.class);
int id = 1;
if (id != 0)
dc.add(Restrictions.eq("id", id));
Date age = new Date();
if (age != null)
dc.add(Restrictions.le("birthday", age));
List users = dc(dc);
System.out.println("离线查询返回结果:" + users);

适用情况:面向对象操作,分离业务与底层,不需要字段属性摄入到Dao实现层。 缺点:适用面较HQL有限。
例子查询

static List example(User user) {
Session s = HibernateUtil.getSession();
List<User> users = s.createCriteria(User.class).add(
Example.create(user)).list();
// List<User>
// users2=s.createCriteria(User.class).add((Example.create(user)).ignoreCase())
// .createCriteria("child").add((Example.create(user))).list();
return users;
}

适用情况:面向对象操作。 缺点:适用面较HQL有限,不推荐。

sql查询

static List sql() {

Session s = HibernateUtil.getSession();
Query q = s.createSQLQuery("select * from user").addEntity(User.class);
List<User> rs = q.list();
s.close();
return rs;
}

适用情况:不熟悉HQL的朋友,又不打算转数据库平台的朋友,万能方法 缺点:破坏跨平台,不易维护,不面向对象。
命名查询

static List namedQuery(int id) {
Session s = HibernateUtil.getSession();
Query q = s.getNamedQuery("getUserById");
q.setInteger("id", id);
return q.list();
}

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="com.sy.vo.User" table="user" catalog="news">

</class>
<!-- 命名查询:定义查询条件 -->
<query name="getUserById">
<![CDATA[from User where id=:id]]>
</query>
<!-- 命名查询中使用sql,不推荐使用,影响跨数据库
<sql-query name="getUserById2">
<![CDATA[select * from User where ]]>
</sql-query> -->
</hibernate-mapping>

适用情况:万能方法,有点像ibatis轻量级框架的操作,方便维护。 缺点:不面向对象。基于hql和sql,有一定缺陷。
秋风2729
推荐于2017-09-28 · 知道合伙人旅游行家
秋风2729
知道合伙人旅游行家
采纳数:395 获赞数:18265
安阳师范学院13级学生。

向TA提问 私信TA
展开全部
Hibernate有4种查询方法。
HQL 通过Hibernate提供的查询语言进行查询。Hibernate Query lanague
EJBQL(JPQL 1.0) 是EJB提供的查询语言
QBC(query by cretira)通过Cretira接口进行查询
QBE(query by Example) 通过Example编程接口进行查询
从功能强弱上排序:NativeSQL > HQL > EJBQL(JPQL 1.0) >QBC(query by cretira) >QBE(query by Example) 1: QBE (Query By Example) QBC查询方式。
QBC(Query By Criteria)查询方式是 Hibernate 提供的“ 更加面向对象”的一种检索方式。 QBC 在条件查询上比 HQL 查询更为灵活,而且支持运行时动态天生查询语句。
在Hibernate 应用中使用 QBC 查询通常经过 3 个步骤:
(1)使用 Session 实例的 createCriteria() 方法创建 Criteria 对象
(2)使用工具类 Restrictions 的相关方法为 Criteria 对象设置查询对象
(3)使用 Criteria 对象的 list() 方法执行查询,返回查询结果QBE查询QBE查询就是检索与指定样本对象具有相同属性值的对象。因此QBE 查询的关键就是样本对象的创建,样本对象中的所有非空属性均将作为查询条件。 QBE 查询的功能子集,固然 QBE 没有 QBC 功能大,但是有些场合 QBE 使用起来更为方便。
工具类Example 为 Criteria 对象指定样本对象作为查询条件Java代码:
1 Session session = HibernateSessionFactory.getSessionFactory().openSe ssion();
2 Transaction ts = session.beginTransaction();
3 Customer c = new Customer();
4 c.setCname("Hibernate");
5 Criteria criteria = session.createCriteria(Customer. class );
6 Criteria.add(Example.create(c));
7 Iterator it = criteria.list().iterator();
8 ts.commit();
9 HibernateSessionFactory.closeSession();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
日天小子胖胖
2014-07-25
知道答主
回答量:22
采纳率:0%
帮助的人:17.7万
展开全部
我只说 我常用的几种 Hibernate hql查询方法

Hibernate 在Spring管理下 可以用类继承了(extends) HibernateDaoSupport
然后 下面是一个我熟悉的写法:
public List<Prov> find(final String hql, final int currentPage, final int pageSize,
final String[] params)
{
return this.getHibernateTemplate().executeFind(new HibernateCallback()
{

@Override
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
Query query = session.createQuery(hql);
for(int i =0 ;i<params.length;i++)
{
query.setString(i, params[i]);
}
query.setFirstResult(PageUtil.startRec(currentPage, pageSize));
query.setMaxResults(pageSize);

return query.list();
}
});
}

调用和传递参数

String hql ="from Prov p where p.prov_id like ? and p.prov_name like ?";
String[] params ={"%"+prov.getProv_id()+"%","%"+prov.getProv_name()+"%"};
return super.find(hql,currentPage,pageSize,params);
分页查询 得到 各种条件下的省市

List<LinkUser> list = (List<LinkUser>) getHibernateTemplate().find(
"from LinkUser lu where lu.userNo = '" + no + "'");
等等。

如果只用 Hibernate 简单的 直接写

protected List<T> find(String hql, String... params)
{

Query query = session.createQuery(hql);
for (int i = 0; i < params.length; i++)
{
query.setString(i, params[i]);
}
return query.list();
}
或protected List<T> page(String hql,int currentPage,int pageSize, String... params)
{

Query query = session.createQuery(hql);
for (int i = 0; i < params.length; i++)
{
query.setString(i, params[i]);
}
query.setFirstResult(PageUtil.startRec(currentPage, pageSize));
return query.list();
}
除了以上还有criteria查询,本人没用过,网上还有许多,你自己可以搜搜,学习学习
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
轻风暖云
2018-09-29 · TA获得超过108个赞
知道答主
回答量:117
采纳率:0%
帮助的人:6万
展开全部

HIbernate主要常用有三种查询方式HQL、QBC、SQL:

1).HQL(Hibernate Query Language):hibernate数据查询语言;

2).QBC(Query By Criteria):规则查询

3).SQL:原生的SQL语句(较为复杂的情况下使用)

想要详细了解的可以看一下下面的几篇文章:

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-07-25
展开全部
是想查询什么呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式