當前位置:首頁 » 編程語言 » 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方法中也同樣可以指定查詢方式;

熱點內容
iqoo清除應用緩存 發布:2025-07-10 15:34:34 瀏覽:844
手機rm文件夾 發布:2025-07-10 15:30:48 瀏覽:581
游戲腳本掛 發布:2025-07-10 15:21:46 瀏覽:588
sql寫數據 發布:2025-07-10 15:01:29 瀏覽:163
php入門手冊 發布:2025-07-10 14:42:24 瀏覽:792
手機如何設密碼鎖屏 發布:2025-07-10 14:17:06 瀏覽:803
java求絕對值 發布:2025-07-10 14:10:55 瀏覽:653
usb調試開關在哪裡安卓 發布:2025-07-10 13:59:55 瀏覽:78
資料庫維度 發布:2025-07-10 13:54:31 瀏覽:799
c語言位域的賦值 發布:2025-07-10 13:54:30 瀏覽:583