hibernate的if条件查询(我用hibernate中的hql语句写了一个条件查询,但是不能正常执行,请帮忙看一下)

本文目录
我用hibernate中的hql语句写了一个条件查询,但是不能正常执行,请帮忙看一下
你报的错误是啥?很直观的看你的代码,在所有的and之前都没有空格,所以拼出来的HQL是有问题的,你的代码还有几个问题
1,最好用StringBuilder或者StringBuffered
2,最好不要用where 1=1这样查询效率最低。
如果你想了解更多的Hibernate查询或者HQL的东西,看我的个人简介里面的推荐资料。
Hibernate中Criteria的对象字段如何查询
到了Hibernate3.0以后,关联关系的对象默认都是使用延迟加载,例如《one-to-many》时.但我在映射《one-to-one》,《many-to-one》关系时指定了lazy="true",但是在查询对象时,我只想查询一个对象,仍然会把这个对象所关联的《one-to-one》,《many-to-one》对象一起查询出来,这样造成了极大的性能浪费.在不指定lazy属性时,《many-to-one》所关联的对象反而会延迟加载,这让我大为困惑,还以为是Hibernate的bug.
在网上查找资料,说在为了延迟加载《one-to-one》,《many-to-one》所关联的对象,需要设置被关联的对象《class name="" lazy="true"》,我也这样做了,但是仍然没有效果.
仔细阅读了Hibernate的手册,才发现原来要延迟加载《one-to-one》,《many-to-one》所关联的对象时,除了要指定lazy="true"外,还需要运行期字节码增强,而我省去了这一步,所以延迟加载没有效果.同时还发现在默认情况下,《one-to-one》,《many-to-one》的lazy属性是"proxy"而不是"true"!因此如果直接采用lazy的默认值,是可以延迟加载的.
总结一下:
《many-to-one》默认的属性是lazy="proxy",此时默认是会延迟加载的.在指定了lazy="true"之后,必须要经过运行期字节码增加,延迟加载才有效果.
而《one-to-one》相对要复杂一点,延迟加载还要受到constrained属性的限制.constrained="false"时表明实体和被关联到的实体的约束不是强制的,即存在一个实体时,它通过《one-to-one》关联的实体可能存在,也可能不存在,这时在查询实体时,Hibernate总会发起一次查询检查《one-to-one》所关联的实体是否存在,而这时已经可以把one-to-one关联的实体查询出来了,因此在《one-to-one》关系中,如果constrained="false",总是会立即加载关联到的实体.
如果当constrained="true",且lazy="proxy"(默认),是可以延迟加载的.
如果当constrained="true",且lazy="true"时,需要经过运行期字节码增加,延迟加载才会奏效.
使用hibernate后,观念应该转变过来, 一个对象应该是完整, 所以没法返回一个只包含某几个属性(字段) 的对象。 例如,一个人,就不能只返回一个头, 还是手什么的
如果数据量过大, 当然还是有这个必要. 也可以做到, 但是返回的不会是对象,而是字段数组.
hibernate 管这叫投影 Criteria criteria=session.createCriteria(User.class);
ProjectionList proList = Projections.projectionList();//设置投影集合 proList.add(Projections.groupProperty("userName")); proList.add(Projections.groupProperty("password")); criteria.setProjection(proList);
最后返回的List是 Object = password 如果你真的只用来查 userName,password, 那就小题大做了 我想直接取出view(String userName,String password)的形式,
即hql:select new view(userName,password) from ....
两种方法 1 属性的延迟载入
在hbm.xml的属性上加 lazy=true
2 轻量设计
单独设计一个类, 只包含 userName 和password
我的意思就是设计了一个类用来存放username和password,但是Criteria能返回这个bean类型的一个List吗?
再写一个xml啊, 没人规定一张表只能映射一次
轻量的employee映射
请教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 copy
package 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 copy
List emps = criteria.add(Restrictions.sqlRestriction("birthday 》 ’1980-01-01’ AND employee_name like ’刘%’")).list();
上述无论是birthday还是employee_name都是数据库中表的字段名称,看起来是不是特别好用,此外还可以直接通过属性实例构建查询条件,比如要查询出学习是高中、中专的员工有哪些:
view plain copy
List emps = criteria.add(Property.forName("degree").in(new String{"高中","中专"})).list();
3.3 对结果集进行排序,同样可以分为上述两种方式
view plain copy
List 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 copy
from
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 copy
List depts = criteria.add(Restrictions.sqlRestriction("dept_name LIKE ’北京%’")).createAlias("slEmployees", "emps2", JoinType.LEFT_OUTER_JOIN, Restrictions.gt("salary",6000.0)).list();
生成SQL如下:
view plain copy
from
sl_dept this_
left outer join
sl_employee emps2x1_
on this_.dept_id=emps2x1_.DEPT_ID
and (
emps2x1_.SALARY》?
)
where
dept_name LIKE ’北京%’
另外同样在createCriteria方法中也同样可以指定查询方式;

更多文章:
easyui调用bartendee模板(EXCEL数据库调用BarTender10.1问题)
2026年7月18日 14:45
matlab sym(大家好!matlab中syms是什么意思)
2026年3月27日 04:15
technology各种词性(technique与technology的区别)
2026年3月28日 22:00
facilitate英语怎么读(促成的英语翻译 促成用英语怎么说)
2026年2月28日 23:30
vue2diff算法(简单几句话,知道什么是回流重绘、vue虚拟dom、diff算法和key)
2026年2月26日 10:15
column在sql是什么意思(sql语句中的information_schema.COLUMNS 是什么意思呢)
2026年8月17日 16:15
powerpoint模板(如何制作PowerPoint的模板)
2025年7月6日 00:15
optimistic怎么读英语(optimistic怎么读)
2026年3月8日 11:45
html中生成滚动条或文字(html如何实现滚动文字和音乐)
2026年2月25日 20:45
conventionally a phoneme(conventionally是什么意思)
2026年2月16日 02:45
css下拉菜单颜色(如何用CSS把下拉菜单背景色弄成透明而上面的文字不透明)
2025年6月3日 05:45
html5支持的标签(html5 新加的标签元素例如:<header><section><footer>解惑)
2025年11月17日 20:30
dom4j生成xml特殊字符不转义(JAVA dom4j怎样将双引号 写入XML时为“ 表示)
2025年12月14日 22:45
headerstyles设表头样式(word怎么绘制表头斜线并打字)
2026年8月7日 22:15














