本文目录
- hibernate的多条件动态查询
- Hibernate数据查询
- 请教Hibernate 的 Criteria 的 in 查询
- hibernate怎么实现模糊查询
- Hibernate如何查询排好序的前十条数据
- Hibernate的查询方式
hibernate的多条件动态查询
在hibernate中是支持多条件动态查询的 这种问题是非常实用的 比如说你做一个项目要实现一个复合查询
例如有这么一个界面
那么要实现这个查询 对于用户来说他的查询条件可能不健全 有可能只填写其中的 项 那么要实现这个查询 我们可以用hibernate的动态条件查询
下面我写一个例子
我有一张表叫user表
package fish testdao;
import java sql Date;
public class User {
int id;
String name;
int age;
Date brithday;
public String getName() {
returnname;
}
public void setName(String name) {
this name = name;
}
public int getAge() {
returnage;
}
public void setAge(int age) {
this age = age;
}
public Date getBrithday() {
returnbrithday;
}
public void setBrithday(Date brithday) {
this brithday = brithday;
}
public int getId() {
returnid;
}
public void setId(int id) {
this id = id;
}
}
User hbm xml
《?xmlversion= encoding= UTF ?》
《!DOCTYPEhibernate mapping PUBLIC
//Hibernate/HibernateMapping DTD //EN
hiber/hibernate mapping dtd 》
《hibernate mapping》
《classname= fish testdao User 》
《idname= id type= integer 》
《generatorclass= increment 》《/generator》
《/id》
《propertyname= name 》《/property》
《propertyname= age 》《/property》
《propertyname= brithday 》《/property》
《/class》
《/hibernate mapping》
在XXX cgf xml注册一下
然后我们写一个测试类
package fish domain;
import java sql Date;
import java util List;
import hibernate Criteria;
import hibernate Session;
import hibernate Transaction;
import hibernate criterion DetachedCriteria;
import hibernate criterion Restrictions;
import fish testdao User;
import fish util HibernateSessionFactory;
public class Test {
public static void main(String args) {
// addData();
queryData();
}
// 添加数据
public static void addData() {
Session session = HibernateSessionFactory getSession();
Transaction transaction = session beginTransaction();
transaction begin();
for (int i = ; i 《 ; i++) {
User user = new User();
user setAge( + i);
user setName( 张 + i);
user setBrithday(Date valueOf( ));
session save(user);
}
mit();
session close();
}
// 查询数据
public static void queryData() {
String outName = 张 ;
int outAge = ;
Date outDate = null;
Session session = HibernateSessionFactory getSession();
DetachedCriteria dc = DetachedCriteria forClass(User class);
if (outName !=null) {
dc add(Restrictions eq( name outName));
}
if (outAge 》 ) {
dc add(Restrictions eq( age outAge));
}
if (outDate !=null) {
dc add(Restrictions eq( brithday outDate));
}
Criteria c = dc getExecutableCriteria(session);
List《User》 list = c list();
for (User i : list) {
System out println(i getName() + + i getAge());
}
}
}
看看测试类中的查询方法 如果String outName = 张 ;
intoutAge = ;
DateoutDate = null;
这三个条件是通过从前台或者是用户输入的那么就实现了多条件的动态查询
我们看看数据库的信息
显然这个里面有一条记录是符合的 我们看看输出的结果是什么
张
lishixinzhi/Article/program/Java/ky/201311/28511
Hibernate数据查询
前两种性质是一样的,你看下源码就知道了: Spring的org.springframework.orm.hibernate3.HibernateTemplate中的方法: public List find(String queryString) throws DataAccessException {return find(queryString, (Object) null);}public List find(final String queryString, final Object... values) throws DataAccessException {return executeWithNativeSession(new HibernateCallback《List》() {public List doInHibernate(Session session) throws HibernateException {Query queryObject = session.createQuery(queryString);prepareQuery(queryObject);if (values != null) {for (int i = 0; i 《 values.length; i++) {queryObject.setParameter(i, values);}}return queryObject.list();}});} 其实org.hibernate.impl.SessionImple里还有一种find(String hql)的。 至于Criteria,其实就是方便面向对象的编码者而设计的,让编码者省去考虑面向关系的逻辑,其实质是一样的。你可以查下源码吧。
请教Hibernate 的 Criteria 的 in 查询
Hibernate中提供了三种查询方式,分别为HQL、Criteria查询、本地化SQL查询,实际应用中,有很多人忽略了Criteria的用处,觉得不如另外两种贴近SQL方式便捷,实际则未必,很多情况下Criteria更具有优势;本篇文章就对Criteria查询做一个全面的介绍,以期尽可能的将更多的Criteria强大的查询功能展现出来;1、首先新建一个Maven Web Project项目,本次使用的是hibernate4.3.11版本,使用MySql数据库,添加如下依赖: view plain copy《!-- 引入mysql jar依赖 --》 《dependency》 《groupId》mysql《/groupId》 《artifactId》mysql-connector-java《/artifactId》 《version》5.1.38《/version》 《/dependency》 《!-- 引入hibernate依赖 --》 《dependency》 《groupId》org.hibernate《/groupId》 《artifactId》hibernate-core《/artifactId》 《version》4.3.11.Final《/version》 《/dependency》 新建完毕后,项目结构如下:2、entity包下面放置的是通过Hibernate反向工程生成的实体映射类,samples包下面放置测试类,同样hibernate.cfg.xml文件需要配置,在此就不一一展示了,好了,准备工程就这么多,下面开始介绍Criteria的实际操作;3、Criteria查询3.1 获取Criteria对象 view plain copypackage com.hibernate.samples; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.hibernate.entity.SlEmployee; public class HibernateTest { // 声明一个Hibernate Session类型的变量 private Session session; @Before public void getSession(){ Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); session = sessionFactory.openSession(); } @After public void closeSession(){ if(session != null){ session.close(); } } @Test public void doCreateCriteriaInstance(){ // 获取Criteria实例对象 Criteria criteria = session.createCriteria(SlEmployee.class); Assert.assertNotNull(criteria); } } 3.2 在SQL中,我们可以通过WHERE关键字对条件进行定义,那么在Criteria中呢?看例子 view plain copy@Test public void doConditionQueryInCriteria() { // 获取Criteria实例对象 Criteria criteria = session.createCriteria(SlEmployee.class); // 查询出王姓员工且收入在3000到5000之间的 // 类似于HQL中 WHERE employeeName LIKE ’王%’ AND salary BETWEEN 3000 AND 5000 List emps = criteria.add(Restrictions.like("employeeName", "王%")) .add(Restrictions.between("salary", 3000.0, 5000.0)).list(); // 查询出工资在4000以下或5000以上的王姓员工 // 可以通过Restrictions的or或and进行逻辑分组 emps = criteria.add(Restrictions.like("employeeName", "王%")) .add(Restrictions.or(Restrictions.gt("salary", 5000D), Restrictions.lt("salary", 3000D))).list(); // 查询出岗位是软件工程师或测试工程师,且学历是硕士、本科或大专的员工有哪些 emps = criteria.add(Restrictions.in("position", new String { "软件工程师", "测试工程师" })) .add(Restrictions.disjunction().add(Restrictions.eq("degree", "硕士")).add(Restrictions.eq("degree", "本科")) .add(Restrictions.eq("degree", "大专"))) .list(); } 上述三个查询可以看出Restrictions类提供了内建Cretirion类型来满足各种查询状况,此外Criteria还有一个特别强大的功能,那就是允许你直接指定SQL查询,看例子 view plain copyList emps = criteria.add(Restrictions.sqlRestriction("birthday 》 ’1980-01-01’ AND employee_name like ’刘%’")).list(); 上述无论是birthday还是employee_name都是数据库中表的字段名称,看起来是不是特别好用,此外还可以直接通过属性实例构建查询条件,比如要查询出学习是高中、中专的员工有哪些: view plain copyList emps = criteria.add(Property.forName("degree").in(new String{"高中","中专"})).list(); 3.3 对结果集进行排序,同样可以分为上述两种方式 view plain copyList emps = criteria.add(Restrictions.sqlRestriction("birthday 》 ’1970-01-01’")).addOrder(Order.asc("birthday")) .addOrder(Order.desc("salary")).list(); List emps = criteria.add(Restrictions.sqlRestriction("birthday 》 ’1970-01-01’")) .addOrder(Property.forName("birthday").asc()).addOrder(Property.forName("salary").desc()).list(); 3.4 上述几个例子直接演示了对我们想要实体的操作,大家都知道每个实体都会有好多关联实体,比如一个请假实体类会关联请假申请人与审批人、一篇博客会关联作者和分类信息实体、一个订单会关联多个商品实体,顾客实体,地址实体等,如果此时我们想通过对关联实体的限制,最终限制想要的实体,那应该怎么处理呢,看例子; view plain copy// 比如我们想查询北京各个公司中,员工学历中包括高中、中专、大专的公司部门有哪些 List depts = criteria.add(Restrictions.sqlRestriction("dept_name LIKE ’北京%’")) .createCriteria("slEmployees").add(Restrictions.in("degree", new String{"高中","中专","大专"})).list(); 上述方法生成下列SQL文 view plain copyfrom sl_dept this_ inner join sl_employee slemployee1_ on this_.dept_id=slemployee1_.DEPT_ID where dept_name LIKE ’北京%’ and slemployee1_.DEGREE in ( ?, ?, ? ) 通过该实例我们可以得出:a)可以通过createCriteria方法来通过关联实体限制最终查询实体;b)默认采用内连接的方式关联查询那么如果我们想采用比如左连接,右连接甚至是全外连接的话又该怎么做呢,看例子: view plain copyList depts = criteria.add(Restrictions.sqlRestriction("dept_name LIKE ’北京%’")).createAlias("slEmployees", "emps2", JoinType.LEFT_OUTER_JOIN, Restrictions.gt("salary",6000.0)).list(); 生成SQL如下: view plain copyfrom sl_dept this_ left outer join sl_employee emps2x1_ on this_.dept_id=emps2x1_.DEPT_ID and ( emps2x1_.SALARY》? ) where dept_name LIKE ’北京%’ 另外同样在createCriteria方法中也同样可以指定查询方式;
hibernate怎么实现模糊查询
以下是用 hibernate的HQL(面向对象的查询语言)实现模糊查询。这是一种比较理想的方式。如果模糊查询的条件太多,你可以选择使用StringBuffer来处理,可以提高一定的性能。public List findStudentForName (String name) throws Exception{Session session=HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); // SQL代码String strSQL="from Student as s where s.name like :name";// 获取查询对象Query query = session.createQuery(strSQL);query.setString("name", "%" + name + "%");List result = query.list();for( int i = 0; i 《 result.size(); i ++ ) {Student stu = (Student)result.get(i);String name = stu.getName();System.out.println("name=" + name);}session.getTransaction().commit();return result; }
Hibernate如何查询排好序的前十条数据
hibernate有两种查询排序的方式:内存排序和数据库排序。 数据库排序使用order-by属性。 内存排序使用sort属性。其中sort的属性值natural代表的是自然升序排列,unsorted代表的是不排序,此外,还可以自定义排序规则,方式是定义一个类,让其实现Comparator 接口,并且实现该接口中的compare方法,在该方法中实现排序规则即可。 然后将该自定义排序规则的类名作为sort的属性值即可。
Hibernate的查询方式
【答案】:Sql、Criteria,object comptositionHql:1、 属性查询2、 参数查询、命名参数查询3、 关联查询4、 分页查询5、 统计函数