当前位置:首页 » 编程语言 » hibernatesqlin参数

hibernatesqlin参数

发布时间: 2023-04-28 05:16:05

❶ hibernate的的sql查询怎么设置参数

有多种方式
1 变量直接赋值
sql = select * from xx where t.a ="+b+"
b="s";
执行
2 select * from xx where t.a=b
creatSQLQuery(sql).addScalar("b".Hibernat.String)//类型

❷ hibernate sql语句参数为null时,如何处理

目的:删除满足条件的数据。 出现问题:参数为null时,程序出现异常。 问题描述:之塌灶前运芦代码如下: sql="delete table where pId=? and sId=?"; query.setParameter(0, pId); query.setParameter(1, sId); 现在遇到一个问题,就是如果参数传一个null的时候,hibernate不会将sql转换成is null,程序将会出现错误,所以修改成如下: //两个参数均不是主键 public void deleteTable(Long sId, Long pId) { String sql = "delete table where 1=1"; if (null == pId) { sql = sql + " and pIdis null"; } else { sql = sql + " and pId=?"; } if (null == sId) { sql = sql + " and sIdis null"; } else { sql = sql + " and sId=?"; } Query query = getSession().createQuery(sql); //这样判断简直让人崩溃,有啥好的处理方式? if (null != pId && null == sId) { query.setParameter(0, pId); } if (null != pId && null != sId) { query.setParameter(0, pId).setParameter(1, pId); } if (null == pId && null != sId) { query.setParameter(0, pId); } query.executeUpdate(); } 这样是可以实现业务逻辑的,但是显然程序很笨重旁衫带,不知到hibernate本身有没有灵活、优雅的方式解决这个问题?

❸ 怎么用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显示执行sql的参数

试试
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
log4j的级别,要对应

更早期的
log4j.logger.org.hibernate.type=TRACE

log4j.logger.org.hibernate.sql=TRACE

❺ hibernate中自己写sql怎么传递参数

方法是:
1、Show_SQL 参数,输入告升猛值为袜桥True 。
2、保存hibernate.cfg.xml。
这时,再次运行你的程序,在控制台视图中将会显示相应的SQL语句。
另外,如果按照同样的步骤,分别加入以下参数,可以让SQL语句更加完美笑散:
1)参数:format_sql=true 使SQL语句格式更加美观统一;
2)参数:use_sql_comments=true 使SQL语句中自动注入注释,增加可读性

❻ hibernate的三种查询方式

1.1、SQL概述

HQL是Hibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL接近SQL`语句查询语法。

完整的HQL语句形式如下:

select | update | delete … from … where … group by … having … order by … asc|desc

其中的update、delete为Hibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。HQL查询在整个Hibernate实体操作体系中占核心地位。

String hql = "HQL语句";

Query query = session.createQuery(hql);

List list = query.list(); //查询得到多个实体对象集合

Object result = query.uniqueResult(); //查询得到一个实体对象

int x = query.executeUpdate(); //执行update或delete语句悄陵,返回数据表受影响行数

1.2、实体查询

查询过程中表名使用类名,列名使用属性名,类名和属性名称区分大小写

String hql="from Users";//from 实体类类型名称

Query query = session.createQuery(hql);

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

for (Users user : list) {

    System.out.println(user);

}

1.3、带where的查询

Query query = session.createQuery("from Users where uid=3");

Users user = (Users) query.uniqueResult();//uniqueResult 单一对象

System.out.println(user);

Query query = session.createQuery("from Users where uid>5");

List<燃雹Users>皮运帆 list = query.list();

for (Users user : list) {

    System.out.println(user);

}

1.3、属性查询

查询部分属性

String hql="select u.uid,u.uname,u.upwd from Users u where u.uname='张三'";

Query query = session.createQuery(hql);

List<Object[]> list = query.list();

for (Object[] objects : list) {

    System.out.println(Arrays.toString(objects));

}

String hql="select new Users(u.uname,u.upwd) from Users u where u.uname='张三'";

Query query = session.createQuery(hql);

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

for (Users user : list) {

    System.out.println(user);

}

1.4、实体的更新和删除

从hibernate 3版本开始才支持

//更新

String hql="update Users set uname='王五',upwd='321' where uid=3";

int res = session.createQuery(hql).executeUpdate();

//删除

String hql="delete from Users where uid=3";

int res = session.createQuery(hql).executeUpdate();

/*

返回值结果:

正整数:表受影响的行数据

0: 语句正常执行,但没有行受影响

负整数:通常是-1,执行HQL语句是一条查询语句

*/

HQL语句不能做添加

1.5、分组与排序

排序

处理方式和SQL语句中的排序是一样的

String hql="from Users order by uid";

Query query = session.createQuery(hql);

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

for (Users user : list) {

    System.out.println(user);

}

order by语句只能出现在语句的最后位置

分组

处理方式和SQL语句中分组查询相同

分组语句需要处理筛选,只能使用having语句,而不能使用where语句。

String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno";

String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno having count(e)>=5";

1.6、参数绑定

使用占位参数

String hql="from Users where uid=? or uname=?";

Query query = session.createQuery(hql);

//索引从0开始

query.setInteger(0, 3);//query.setParameter(0, 3);

query.setString(1, "张三");//query.setParameter(1, "张三");

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

for (Users user : list) {

    System.out.println(user);

}

使用参数名称

String hql = "from Users where uid=:no1 or uid=:no2";

Query query = session.createQuery(hql);

query.setInteger("no1", 1);

query.setInteger("no2", 3);

//....

可以使用点位参数和名称参数混合使用

String hql = "from User where uid=? or uid=:no2";

Query query = session.createQuery(hql);

query.setInteger(0, 7788);

query.setInteger("no2", 7566);

//....

//使用点位参数和名称参数混合使用,所有点位参数必须放在前面,一旦有名称参数出现,其后将不能再出现占位参数

1.7、连接查询

--SQL语句:查询员工姓名、薪资、部门名称

SELECT ENAME,SAL,DNAME

FROM EMP e JOIN DEPT d ON e.DEPTNO=d.DEPTNO

SELECT ENAME,SAL,DNAME FROM EMP,DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO

没有on语句

能被连接到查询中的必须是主查询对象的子属性

String hql="SELECT e.ename, e.sal, e.dept.dname FROM Emp e";

//HQL连接查询

String hql="SELECT e.ename, e.sal, d.dname FROM Emp e JOIN e.dept d";

String hql = "SELECT e FROM Emp e JOIN e.dept"; //JOIN将没有意义

String hql = "FROM Emp e JOIN e.dept";

Query query = session.createQuery(hql);

List<Object[]> list = query.list();

//List集合中的数组中会保存两个元素:

//0:主数据(Emp)

//1:从数据(Dept)

//查询编号为7788的员工信息,同时将对应的dept信息和manager信息查询并保存在对应的子属性中

String hql = "FROM Emp e JOIN FETCH e.dept d JOIN FETCH e.manager m WHERE e.empno=7788";

Query query = session.createQuery(hql);

Emp emp = (Emp) query.uniqueResult();

System.out.println(emp);

System.out.println(emp.getManager());

System.out.println(emp.getDept());

1.8、分页

String hql = "from Users";

Query query = session.createQuery(hql);

query.setFirstResult(0);

query.setMaxResults(2);

2、QBC查询

QBC(Query By Criteria)查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。

QBC查询最重要的三个类:

Restrictions 条件限制

Projections 列设射

Order 排序

2.1、查询实现

Criteria criteria = session.createCriteria(Users.class);

//session.createCriteria("entity.Users");

//session.createCriteria(Users.class, "别名");

List<Dept> list = criteria.list();

//查询单行结果(如果结果有两行或更多,会报错)

Object uniqueResult = criteria.uniqueResult();

2.2、Projections 列投射

语法:

//查询uname属性

Criteria criteria = session.createCriteria(Users.class);

PropertyProjection property = Projections.property("name");

criteria.setProjection(property);

List<Object> result = criteria.list();

//查询uname, upwd属性

Criteria criteria = session.createCriteria(Users.class);

//1.创建投射列表

ProjectionList projectionList = Projections.projectionList();

//2.向投射列表中添加列投射

PropertyProjection property1 = Projections.property("uname");

PropertyProjection property2 = Projections.property("upwd");

projectionList.add(property1).add(property2);

//3.将投射列表设置到准则中

criteria.setProjection(projectionList);

List<Object> result = criteria.list();

返回值类型 方法名称 描述

PropertyProjection Projections.property 指定某属性

AggregateProjection Projections.avg 求平均值

CountProjection Projections.count 统计某属性的数量

CountProjection Projections.countDistinct 统计某属性不同值的数量

PropertyProjection Projections.groupProperty 指定某个属性为分组属性

AggregateProjection Projections.max 求最大值

AggregateProjection Projections.min 求最小值

ProjectionList Projections.projectionList 创建一个ProjectionList对象

Projection Projections.rowCount 查询结果集中的记录条数

AggregateProjection Projections.sum 求某属性的合计

2.3、Restrictions 条件限制

语法:

Criteria criteria = session.createCriteria(Users.class);

Criterion notNull = Restrictions.isNotNull("comm");

criteria.add(notNull); //添加一个条件(如果添加了多个条件,默认条件之间使用and连接)

List<Users> list = criteria.list();

返回值类型 方法名称 描述

SimpleExpression Restrictions.eq 等于(equal)

Criterion Restrictions.allEq 使用Map,Key/Valu进行多个等于的比对

SimpleExpression Restrictions.gt 大于(great than)

SimpleExpression Restrictions.ge 大于等于(great than or equal)

SimpleExpression Restrictions.lt 小于(less than)

SimpleExpression Restrictions.le 小于等于(less than or equal)

Criterion Restrictions.between 对应SQL的between

SimpleExpression Restrictions.like 对应SQL的like

Criterion Restrictions.in 对应SQL的in

LogicalExpression Restrictions.and and关系

LogicalExpression Restrictions.or or关系

Criterion Restrictions.isNull 为空

Criterion Restrictions.sqlRestriction SQL限定查询

Criterion Restrictions.not 取反

2.3、Order排序

语法:

Criteria criteria = session.createCriteria(Dept.class);

criteria.addOrder(Order.asc("name"))

.addOrder(Order.desc("loc"));

//SELECT * FROM DEPT ORDER BY name ASC, loc DESC

返回值类型 方法名称 描述

Order Order.asc(String propertyName) 升序

Order Order.desc(String propertyName) 降序

2.4、分页查询

Criteria criteria = session.createCriteria(Dept.class);

int pageNum = 2, pageSize = 5;

criteria.setFirstResult((pageNum-1)*pageSize); //查询起始行下标

criteria.setMaxResults(pageSize); //查询的最大行数

List list = criteria.list();

//setFirstResult方法和setMaxResults方法同样可以在SQLQuery及Query类型上使用

3、原生SQL查询

1、查询

String sql = "select uid,uname,upwd from _users";

List list = session.createSQLQuery(sql).list();

for(Object obj : list){

    System.out.println(obj);

}

2、 addEntity()

String sql = "select uid,uname,upwd from _users";

// addEntity()可以告诉Hibernate你想要封装成对象的类型,然后自动为你封装

SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);

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

for(Users user : list){

System.out.println(user.getUname());

}

3、 uniqueResult

String sql = "select uid,uname,upwd from _users where uid = 2";

SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);

Users user = (Users) query.uniqueResult();//返回单一对象

System.out.println(user.getUname());

USB Microphone https://www.soft-voice.com/

Wooden Speakers  https://www.zeshuiplatform.com/

亚马逊测评 www.yisuping.cn

深圳网站建设www.sz886.com

❼ Mysql数据库中FIND_IN_SET();在HIbernate中怎么使用。比如,如何传参;

其实是可以使用的,我今天就遇到这个问题,但是必须 这么用 :
在jdbc的SQL中可以不用写比较符,比如:

select * from t_user where find_in_set('zs',username) ;

当然也可以这样用:

select * from t_user where find_in_set('zs',username)>0

而在hibernate的HQL语句中,必须这样用:

from User u where find_in_set('zs',u.username)>0 ;

即‘>0’必须带上,否则会报错。

如果使用动态参数:

Map par = new HashMap();

par.put("buying_patterns", buying_patterns);
Hibernate hql语句 find_in_set 用法
gqo.addQuery("find_in_set(:buying_patterns,obj.buying_patterns)>0", par);

说明:1:buying_patterns buying_patterns 要传的属性值(:表示占位符)
2.obj.buying_patterns 表名.属性名

❽ 怎样在hibernate中用sql做insert,万分感谢我快疯掉了!!!

算你走运了。我三天前遇上了这个情况,不过我自己瞎弄解决了。下面是代码。
public void insertBySql(final String sql,final Object[] values)
{
List list= (List)getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException{
Query query= session.createSQLQuery(sql);
for (int i = 0 ; i < values.length ; i++)
{
query.setParameter( i, values[i]);
}
query.executeUpdate();
Object o=null;
return o;
}
}
);
}

public void saveModerator(Long usId,String kindId,Long roleId)
{
String sql="insert into bbs.t_moderator(us_id,kind_id,role_id) values(?,?,?)";
Object[] o={usId,kindId,roleId};
insertBySql(sql,o);
}

❾ 请教Hibernate 的 Criteria 的 in 查询

Hibernate中提供了三种查询方式,分别为HQL、Criteria查询、本地化SQL查询,实际应用中,有很多人忽略了Criteria的用处,觉得不如另外两种贴近SQL方式便捷,实际则未必,很多情况下Criteria更具有优势;本篇文章就对Criteria查询做一个全面的介绍,以期尽可能的将更多的Criteria强大的查伏余询功能展现出来;
1、首先新建一个Maven Web Project项目,本次使用的是hibernate4.3.11版本,使用MySql数据库,添加如下依赖:

[html] view plain
<!-- 引入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对象

[java] view plain
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中呢?看例子

[java] view plain
@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查询,看例子

[html] view plain
List emps = criteria.add(Restrictions.sqlRestriction("birthday > '1980-01-01' AND employee_name like '刘%'")).list();

上述无论是birthday还是employee_name都是数据库中表的字段名称,看起来是不是特别好用,此外还可以直接通过属性实例构建查询条件,比如要查询出学习是高中、中专的员工有哪些:

[java] view plain
List emps = criteria.add(Property.forName("degree").in(new String[]{"高中","中专"})).list();
3.3 对结果集进行排序,同样可以分为上述两种方式

[java] view plain
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 上述几个例子直接演示了对我们想要实体的操作,大家都知道每个实体都会有好多关联实体,比如一个请假实体类会关联请假申请人与审批人、一篇博客会关联作者和分类信息实体、一个订单会关联多个商品实体,顾客实体,地址实体等,如果此时我们想通过对关联实体的限制,最终限制想要的实体,那应该怎么处理呢,看例子;

[java] view plain
// 比如我们想查询北京各个公司中,员工学历中包括高中、中专、大专的公司部门有哪些
List depts = criteria.add(Restrictions.sqlRestriction("dept_name LIKE '北京%'"))
.createCriteria("slEmployees").add(Restrictions.in("degree", new String[]{"高中","中专","大专"})).list();
上述方法生成下列SQL文

[sql] view plain
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)默认采用内连接的方式关联查询
那么如果我们想采用比如左连接,右连接甚至是全外连接的话又该怎么做呢,看例子:

[java] view plain
List depts = criteria.add(Restrictions.sqlRestriction("dept_name LIKE '北京%'")).createAlias("slEmployees", "emps2", JoinType.LEFT_OUTER_JOIN, Restrictions.gt("salary",6000.0)).list();
生成SQL如下:

[sql] view plain
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方法中也同样可以指定查询方式;

热点内容
这个锁屏密码是什么 发布:2024-11-01 12:24:51 浏览:91
相机存储卡排名 发布:2024-11-01 12:24:49 浏览:957
androidxml格式化 发布:2024-11-01 12:23:14 浏览:164
Vb6编译是错误不知道错误代码 发布:2024-11-01 12:16:23 浏览:158
局域网电脑访问服务器怎么提速 发布:2024-11-01 12:14:09 浏览:321
美创数据库 发布:2024-11-01 12:05:45 浏览:915
你改爱奇艺密码什么意思 发布:2024-11-01 12:04:48 浏览:408
矩阵分解python 发布:2024-11-01 11:58:23 浏览:367
如何查询微信支付密码修改记录 发布:2024-11-01 11:51:57 浏览:206
如何运维gpu服务器 发布:2024-11-01 11:45:23 浏览:366