hibernate mysql 关联查询_Hibernate关联映射及高级查询
一、Hibernate中的關(guān)聯(lián)關(guān)系
1.1、單向一對(duì)多關(guān)聯(lián)關(guān)系
按照以下步驟配置hibernate中持久化類的一對(duì)多對(duì)象關(guān)聯(lián):
(1).持久化類添加關(guān)聯(lián)類的相關(guān)屬性及getter/setter方法。
(2).映射文件中建立該屬性和數(shù)據(jù)庫(kù)表字段的映射信息。
比如班級(jí)對(duì)學(xué)生是一對(duì)多的關(guān)系,班級(jí)類Grade類和Grade.hbm.xml文件如下:
package com.pb.hibernate.po;
import java.util.HashSet;
import java.util.Set;
public class Grade {
private int gid;
private String gname;
private String gdesc;
private Set students=new HashSet();
public Set getStudents() {
return students;
}
public void setStudents(Set students) {
this.students = students;
}
public int getGid() {
return gid;
}
public void setGid(int gid) {
this.gid = gid;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public String getGdesc() {
return gdesc;
}
public void setGdesc(String gdesc) {
this.gdesc = gdesc;
}
public Grade() {
super();
}
public Grade(int gid, String gname, String gdesc, Set students) {
super();
this.gid = gid;
this.gname = gname;
this.gdesc = gdesc;
this.students = students;
}
}
Grade.hbm.xml文件:
/p>
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
使用元素和元素配置一對(duì)多關(guān)系,元素常用屬性如下:
1.name:關(guān)聯(lián)類屬性的名稱,是必須填寫,沒(méi)有默認(rèn)值。
2.table:關(guān)聯(lián)類的目標(biāo)數(shù)據(jù)庫(kù)表,可以不關(guān)聯(lián)數(shù)據(jù)表,沒(méi)有默認(rèn)值。
3.lazy:指定關(guān)聯(lián)對(duì)象延遲加載策略,默認(rèn)為true.
4.fetch:設(shè)置抓取數(shù)據(jù)的策略,默認(rèn)為select.
5.inverse:描述對(duì)象之間關(guān)聯(lián)關(guān)系的維護(hù)方式,默認(rèn)為false.
1.2、單向多對(duì)一關(guān)聯(lián)關(guān)系
多對(duì)一關(guān)聯(lián)關(guān)系和配置一對(duì)多關(guān)聯(lián)關(guān)系步驟一樣,不同的是在配置文件中使用元素配置多對(duì)一關(guān)聯(lián)。
package com.pb.hibernate.po;
import java.util.HashSet;
import java.util.Set;
public class Student {
private int sid;
private String sname;
private String sex;
private Grade grade;// 定義班級(jí)屬性
private Paper paper;
private Set courses=new HashSet();
public Set getCourses() {
return courses;
}
public void setCourses(Set courses) {
this.courses = courses;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
public Paper getPaper() {
return paper;
}
public void setPaper(Paper paper) {
this.paper = paper;
}
public Student() {
super();
}
}
在Student.hbm.xml文件中配置實(shí)體與表的關(guān)聯(lián)關(guān)系:
/p>
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
1.3、雙向一對(duì)多關(guān)聯(lián)關(guān)系:
單向一對(duì)多和單向多對(duì)一可以分別配置使用,如果同時(shí)配置了兩者,就成了雙向一對(duì)多關(guān)聯(lián)關(guān)系,其實(shí)在上面就完成了雙向一對(duì)多關(guān)聯(lián)關(guān)系。
1.4、一對(duì)一關(guān)聯(lián)關(guān)系
數(shù)據(jù)庫(kù)表的一對(duì)一關(guān)聯(lián)關(guān)系可以通過(guò)主鍵關(guān)聯(lián)以及外鍵關(guān)聯(lián)實(shí)現(xiàn),常使用外鍵進(jìn)行關(guān)聯(lián)。
使用學(xué)生表Student和學(xué)生證表paper是一對(duì)一關(guān)聯(lián),xml配置文件如下:
Student表的hibernate.hbm.xml文件在上面已經(jīng)描述不再贅述,下面是學(xué)生證表對(duì)應(yīng)的xml配置文件:
/p>
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
需要注意的是在Student.hbm.xml中,并不需要指定屬性所對(duì)應(yīng)的數(shù)據(jù)表的列,而是通過(guò)paperty-ref指向paper類中的關(guān)聯(lián)對(duì)象屬性student,在paper.hbm.xml中添加了屬性u(píng)pique="true"的作用等同與。
1.5、多對(duì)多關(guān)聯(lián)關(guān)系
Hibernate中多對(duì)多對(duì)象關(guān)聯(lián)的實(shí)現(xiàn)方式有一下兩種:
1.不創(chuàng)建中間表的持久化類,只創(chuàng)建兩端數(shù)據(jù)庫(kù)表的持久化類,在映射文件中使用標(biāo)簽設(shè)置映射。
2.創(chuàng)建中間表,兩端數(shù)據(jù)表的持久化類,針對(duì)中間表的持久化類分別和兩端的數(shù)據(jù)庫(kù)表的持久化類創(chuàng)建一對(duì)多關(guān)聯(lián)。
數(shù)據(jù)庫(kù)中多對(duì)多關(guān)聯(lián)關(guān)系是通過(guò)中間表實(shí)現(xiàn)的,通過(guò)中間表,將兩個(gè)表之間的多對(duì)多關(guān)聯(lián)關(guān)系分別轉(zhuǎn)換為它們和中間表之間的一對(duì)多關(guān)聯(lián)關(guān)系。
使用學(xué)生Student對(duì)課程Course之間的多對(duì)多關(guān)聯(lián)關(guān)系為例設(shè)置多對(duì)多關(guān)聯(lián)關(guān)系,其中Student類的xml文件的配置已經(jīng)在上面描述,下面是Course類的xml文件配置信息。
/p>
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
在配置Student對(duì)象和Course對(duì)象時(shí)候我們注意到有兩個(gè)屬性:cascade(級(jí)聯(lián))和inverse(反轉(zhuǎn))
1.cascade屬性:級(jí)聯(lián)操作是指當(dāng)主控方執(zhí)行某項(xiàng)操作時(shí),是否要對(duì)被關(guān)聯(lián)放也執(zhí)行相同的操作,常用的有,,,使用cascade屬性的常用值如下:
(1).all:對(duì)所有操作進(jìn)行級(jí)聯(lián)操作。
(2).save-update:執(zhí)行保存和更新操作時(shí)進(jìn)行級(jí)聯(lián)操作。
(3).delete:執(zhí)行刪除操作時(shí)進(jìn)行級(jí)聯(lián)操作。
(4).none:對(duì)所有操作不進(jìn)行級(jí)聯(lián)操作。
2.inverse屬性:是對(duì)象之間關(guān)聯(lián)關(guān)系的維護(hù)方式,它可以將維護(hù)關(guān)聯(lián)關(guān)系的任務(wù)反轉(zhuǎn),由對(duì)方完成,inverse只存在與集合標(biāo)記的元素中,inverse為true時(shí),數(shù)量為一的一方反轉(zhuǎn)關(guān)聯(lián)關(guān)系維護(hù)給多的一方,inverse為false時(shí)為主動(dòng)方,有主動(dòng)方負(fù)責(zé)維護(hù)關(guān)聯(lián)關(guān)系。
二、Hibernate檢索方式
Hibernate中提供了一下幾種在數(shù)據(jù)庫(kù)中檢索對(duì)象的方式:
(1).導(dǎo)航對(duì)象圖檢索方式:根據(jù)已經(jīng)加載的對(duì)象,導(dǎo)航到其他對(duì)象,如關(guān)聯(lián)對(duì)象的查詢。
(2).OID檢索方式:按照對(duì)象的OID來(lái)檢索對(duì)象。
(3).HQL檢索方式:使用專門的HQL查詢接口和面向?qū)ο蟮腍QL查詢語(yǔ)言。
(4).QBC(Query By Criteria)檢索方式:QBC提供的API來(lái)檢索對(duì)象,這種API封裝了基于字符串形式的查詢語(yǔ)言,提供了更加面向?qū)ο蟮牟樵兘涌凇?/p>
(5).本地SQL檢索方式:這也是官方推薦的標(biāo)準(zhǔn)查詢方式。
2.1、HQL查詢
HQL(Hibernate Query Language)是Hibernate提供的一種面向?qū)ο蟮牟樵冋Z(yǔ)言,HQL提供了了更加豐富靈活并且強(qiáng)大的功能。
>使用HQL可以避免使用JDBC查詢的一些弊端,不需要再編寫復(fù)雜的sql,將針對(duì)實(shí)體類及屬性進(jìn)行查詢。
>查詢結(jié)果直接放在List中的對(duì)象中,不需要,再次封裝。
>獨(dú)立于數(shù)據(jù)庫(kù),對(duì)不同的數(shù)據(jù)庫(kù)根據(jù)Hibernate dialect屬性自動(dòng)生成不同的sql語(yǔ)句。
Query接口是HQL查詢接口,提供了各種查詢功能,它相當(dāng)于JDBC的Statement和PreparedStatement,通過(guò)Session的createQuery創(chuàng)建其對(duì)象。理解其list()與iterate()方法的查詢機(jī)制,將有助于查詢性能的優(yōu)化。
>list()方法返回List對(duì)象,iterate()方法直接返回Iterator對(duì)象。
>list()方法將不會(huì)在緩存中讀取數(shù)據(jù),它總是一次性地從數(shù)據(jù)庫(kù)中直接查詢所有符合條件的數(shù)據(jù),同時(shí)將獲取的數(shù)據(jù)寫入緩存。
>iterate()方法是獲取符合條件的數(shù)據(jù)的id后,需要時(shí)根據(jù)id在緩存中尋找符合條件的數(shù)據(jù),若緩存中沒(méi)有符合條件的數(shù)據(jù),再到數(shù)據(jù)庫(kù)中查詢。
HibernateUtil工具類:
package com.pb.hibernate.util;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
/**
* 初始化一個(gè)ThreadLocal對(duì)象,ThreadLocal對(duì)象有g(shù)et(),set()方法;
*/
private static final ThreadLocal sessionTL=new ThreadLocal();
private static Configuration conf;
private static SessionFactory sf;
//靜態(tài)代碼塊,只執(zhí)行一次
static{
try {
//解析配置文件
conf=new Configuration().configure();
//創(chuàng)建sesssion工廠
sf=conf.buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 得到session對(duì)象,同時(shí)設(shè)置session對(duì)象到ThreadLocal對(duì)象
* 確保一個(gè)線程用一個(gè)session對(duì)象,而不是多個(gè)線程共享一個(gè)session對(duì)象
* @return 從ThradLocal對(duì)象中得到的session對(duì)象
*/
public static Session getCurrentSession(){
//多線程不公用session
Session session=sessionTL.get();
if (session==null) {
//得到session對(duì)象
session=sf.openSession();
//將session對(duì)象保存到threadLocal對(duì)象中
sessionTL.set(session);
}
return session;
}
/**
* 關(guān)閉session ,同時(shí)從ThreadLocal對(duì)象中清除緩存
*/
public static void closeSession(){
Session session =sessionTL.get();
sessionTL.set(null);//先清空threadLocal
session.close();
}
}
DAO層使用hql查詢:
/**
* 通過(guò)hql語(yǔ)句的query.list()方法得到所有的像的集合
* @return
*/
public List getAll(){
//1.得到session
Session session=HibernateUtil.getCurrentSession();
//2.hql語(yǔ)句
String hql="from Dept";
//得到query對(duì)象
Query query=session.createQuery(hql);
List list=query.list();
return list;
}
2.2、屬性查詢
屬性查詢只查找持久化類的部分屬性而不是全部屬性,通過(guò)屬性查詢有兩種方式:
(1).通過(guò)直接指定屬性進(jìn)行屬性查詢,例如:
/**
* @param deptName
* @param location
* @return
*/
public List getDeptByNameAndLoc(String deptName,String location){
Session session=HibernateUtil.getCurrentSession();
String hql="select deptName,location from Dept";
Query query=session.createQuery(hql);
List list2=query.list();
for (Object[] objects : list2) {
System.out.println(objects[0]+""+objects[1]);
}
return null;
}
(2).通過(guò)構(gòu)造方法進(jìn)行屬性查詢,使用這種方法需要持久化類中添加相應(yīng)的構(gòu)造方法。
/**
* @param deptName
* @param location
* @return
*/
public List getDeptByNameAndLoc(String deptName,String location){
Session session=HibernateUtil.getCurrentSession();
String hql="select new Dept( deptName,location) from Dept";
Query query=session.createQuery(hql);
List list2=query.list();
for (Object[] objects : list2) {
System.out.println(objects[0]+""+objects[1]);
}
return null;
}
2.3、參數(shù)綁定
(1).使用"?"占位符。
public List getDeptByDeptName(String deptName){
Session session=HibernateUtil.getCurrentSession();
String hql="from Dept where deptName like ? ";
Query query=session.createQuery(hql);
//setXxx ;Xxx:數(shù)據(jù)類型
query.setString(0,"%"+deptName+"%");
List list=query.list();
return list;
}
(2).使用命名參數(shù)。
//參數(shù)名稱綁定參數(shù)
public List get(){
Session session=HibernateUtil.getCurrentSession();
//命名參數(shù)
String hql="from Dept where deptName=:deptName";
Query query=session.createQuery(hql);
/**
* 實(shí)體類以及對(duì)應(yīng)的映射文件,自動(dòng)生成
* 方向工程
*/
query.setString("deptName", "deptName");
// query.setParameter("deptName","deptName");
List list=query.list();
for (Dept dept : list) {
System.out.println(dept.getDeptName());
}
return null;
}
2.4、Hibernate分頁(yè)
/**
* 通過(guò)hql語(yǔ)句的query.list()方法得到所有的像的集合
* 分頁(yè)查詢
* @return
*/
public List getAll(int pageIndex){
//1.得到session
Session session=HibernateUtil.getCurrentSession();
//2.hql語(yǔ)句
String hql="from Dept";
//得到query對(duì)象
Query query=session.createQuery(hql);
/**
* 每頁(yè)顯示2條數(shù)據(jù)
* 顯示第五頁(yè)
*/
query.setMaxResults(3);//pageSize每頁(yè)顯示多少條數(shù)據(jù)
query.setFirstResult((pageIndex-1)*3);//設(shè)置第一個(gè),不包括第一個(gè)數(shù)據(jù)(pageIndex-1)*pageSize
List list=query.list();
return list;
}
/**
* 得到總頁(yè)數(shù)
* @param deptName
* @return
*/
public int getTotalCount(String deptName){
Session session=HibernateUtil.getCurrentSession();
StringBuffer hql=new StringBuffer("select count(*) from Dept where 1=1");
List params=new ArrayList();
if (deptName!=null&&!"".equals(deptName)) {
hql.append(" and deptName like ?");
params.add("%"+deptName+"%");
}
Query query=session.createQuery(hql.toString());
for (int i = 0; i < params.size(); i++) {
query.setParameter(i, params.get(i));//第二個(gè)參數(shù)放入的是Object類型
}
long count =(Long)query.uniqueResult();
int totalCount=(int)count;
if (totalCount%3==0) {
return totalCount/3;
}else {
return totalCount/3+1;
}
}
2.5、Criteria查詢概述
Criteria查詢(Query By Criteria, QBC)是與HQL完全不同的一種查詢機(jī)制。Criteria查詢又稱對(duì)象查詢,它采用對(duì)象的方式,封裝查詢條件,并提供了Restriction等類型做輔助,可以使編寫查詢代碼更加方便。
使用Criteria的示例:
/**
* 使用Criteria查詢
*/
public Dept getDeptByCriteria(){
try {
Session session=HibernateUtil.getCurrentSession();
Criteria criteria = session.createCriteria(Dept.class);
Dept dept=(Dept) criteria.uniqueResult();
return dept;
} catch (HibernateException e) {
e.printStackTrace();
}
return null;
}
public Dept getDeptByCriteriaUseRestrictions(){
try {
Session session=HibernateUtil.getCurrentSession();
Criteria criteria = session.createCriteria(Dept.class);
criteria.add(Restrictions.eq("deptNo", "101"));// 添加限制條件
//criteria.addOrder(Order.desc("deptNo"));排序
Dept dept=(Dept) criteria.uniqueResult();
return dept;
} catch (HibernateException e) {
e.printStackTrace();
}
return null;
}
在Criteria查詢中使用Example示例查詢:
在使用Criteria查詢時(shí),設(shè)定查詢條件并非一定使用Restrictions,如果屬性條件更多,使用Restrictions也不方便,Criteria允許先創(chuàng)建一個(gè)對(duì)象模板,以這樣一個(gè)對(duì)象模板作為查詢依據(jù),查詢出來(lái)屬性與類似的對(duì)象。也就是依照已有的對(duì)象,查詢與其屬性相同或者相似的其他對(duì)象,這種查詢也稱示例查詢(Query By Example,QBE)。
public List getDeptByExample(){
List result = null;
try {
Session session=HibernateUtil.getCurrentSession();
Dept dept = new Dept();
dept.setLocation("上海");
Criteria criteria = session.createCriteria(Dept.class);
/**
* Hibernate在自動(dòng)生成SQL語(yǔ)句時(shí),將自動(dòng)過(guò)濾對(duì)象的空屬性,
* 根據(jù)有非空屬性生成查詢條件,如果要想更加精準(zhǔn)可以設(shè)置更多屬性值
*/
criteria.add(Example.create(dept));
result = criteria.list();
return result;
} catch (HibernateException e) {
e.printStackTrace();
}
return null;
}
使用Criteria實(shí)現(xiàn)統(tǒng)計(jì)、分組、分頁(yè):
/**
* 使用Criteria查詢
*/
public List getDeptByCriteria(){
List result = null;
try {
Session session=HibernateUtil.getCurrentSession();
Criteria criteria = session.createCriteria(Dept.class);
criteria.setProjection(Projections.projectionList()
.add(Projections.groupProperty("deptName")) // 按部門名稱分組
.add(Projections.rowCount()) // 統(tǒng)計(jì)所有記錄數(shù)
.add(Projections.avg("deptName"))// 統(tǒng)計(jì)平均數(shù)
.add(Projections.max("deptNo")));// 求最大
result= criteria.list();
return result;
} catch (HibernateException e) {
e.printStackTrace();
}
return null;
}
//分頁(yè)
public List getDeptByCriteriaPage(){
List result = null;
try {
Session session=HibernateUtil.getCurrentSession();
Criteria criteria = session.createCriteria(Dept.class);
criteria.setFirstResult(1);
criteria.setMaxResults(3);
result= criteria.list();
return result;
} catch (HibernateException e) {
e.printStackTrace();
}
return null;
}
2.6、命名HQL查詢
在Dept.hbm.xml中配置:
/p>
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
seq_dept
from Dept d where d.deptNo=:deptNo
]]>
查詢:
public List getDeptByCriteria(){
List result = null;
try {
Session session=HibernateUtil.getCurrentSession();
Query query = session.getNamedQuery("dept");
Dept dept = new Dept();
dept.setDeptNo(101);
query.setProperties(dept);
result= query.list();
return result;
} catch (HibernateException e) {
e.printStackTrace();
}
return null;
}
2.7、DetachedCriteria查詢
public List getAllExamByExamId(Integer examId,
String[] classIds) {
DetachedCriteria detachedCriteria = DetachedCriteria
.forClass(getEntityClass());
detachedCriteria.add(Restrictions.eq("exam.id", examId));
detachedCriteria.add(Restrictions.eq("isDelete",
MySchoolConstant.IS_DELETED_NO));
boolean error = false;
Integer[] intClassIds = new Integer[classIds.length];
for (int i = 0; i < classIds.length; i++) {
if (StringUtils.isEmpty(classIds[i])) {
error = true;
break;
}
intClassIds[i] = Integer.valueOf(classIds[i]);
}
if (!error && intClassIds.length > 0) {
detachedCriteria.add(Restrictions.in("classId", intClassIds));
}
return findList(detachedCriteria);
}
2.8、本地sql查詢
HQL查詢并不能涵蓋所有的查詢特性,一些復(fù)雜的查詢還必須借助sql達(dá)到期望的目標(biāo),也就是本地sql,使用query.createSQLQuery(String sql)方法,同時(shí)使用addEntity()方法將別名與實(shí)體類關(guān)聯(lián)起來(lái)。
public ZAnswer findStudentZAnswerListByParams(Integer recruitId,Integer examId,Integer questionId,Integer userId) {
StringBuffer sql = new StringBuffer();
sql.append(" SELECT * FROM Z_ANSWER t ");
sql.append(" WHERE t.`IS_DELETED` = 0 ");
sql.append(" AND t.`RECRUIT_ID` = :recruitId ");
sql.append(" AND t.`EXAM_ID` = :examId ");
sql.append(" AND t.`TEST_QUESTION_ID` = :questionId ");
sql.append(" AND t.`ANSWER_USER_ID` = :userId ");
sql.append(" ORDER BY t.`IS_CURRENT` DESC,t.`CREATE_TIME` DESC ");
Query query = this.getSession().createSQLQuery(sql.toString()).addEntity(ZAnswer.class);
query.setParameter("recruitId", recruitId);
query.setParameter("examId", examId);
query.setParameter("questionId", questionId);
query.setParameter("userId", userId);
@SuppressWarnings("unchecked")
List result = query.list();
//取得第一條記錄
ZAnswer answer = null;
//排除重復(fù)
if(result.size() > 0){
answer = (ZAnswer) result.get(0);
for (ZAnswer zAnswer : result) {
if(zAnswer.getId() != answer.getId()){
zAnswer.setIsDelete(1);
this.update(zAnswer);
}
}
}
return answer;
}
2.9、Hibernate調(diào)用存儲(chǔ)過(guò)程
創(chuàng)建兩個(gè)存儲(chǔ)過(guò)程,在存儲(chǔ)過(guò)程中in表示輸入,out表示輸出。
1.根據(jù)id查找某條數(shù)據(jù):
CREATE PROCEDURE `findEmpById`(IN id INTEGER(11))
begin
select * from emp where empId=id;
end;
2.根據(jù)id查找某個(gè)字段并返回
CREATE PROCEDURE `getNameById`(in id integer(11),out eName varchar(50))
begin
select empName into eName from emp where empId=id;
end;
調(diào)用第一個(gè)存儲(chǔ)過(guò)程:
package com.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class 調(diào)用存儲(chǔ)過(guò)程 {
/**
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Connection con = session.connection();
String sql = "{call findEmpById(?)}";
CallableStatement cs = con.prepareCall(sql);
cs.setObject(1, 2);
ResultSet rs = cs.executeQuery();
while(rs.next()){
int id = rs.getInt("empId");
String name = rs.getString("empName");
System.out.println(id+"\t"+name);
}
}
}
調(diào)用第二個(gè)存儲(chǔ)過(guò)程:
package com.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class 調(diào)用存儲(chǔ)過(guò)程1 {
public static void main(String[] args) throws SQLException {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Connection conn = session.connection();
String sql = "{call getNameById(?,?)}";
CallableStatement cs = conn.prepareCall(sql);
cs.setObject(1, 3); //設(shè)置輸出參數(shù)
cs.registerOutParameter(2, java.sql.Types.VARCHAR); //設(shè)置第二個(gè)參數(shù)為輸出參數(shù)
cs.execute(); //調(diào)用存儲(chǔ)過(guò)程
String name = cs.getString(2);//獲取輸出參數(shù)
System.out.println(name);
}
}
總結(jié)
以上是生活随笔為你收集整理的hibernate mysql 关联查询_Hibernate关联映射及高级查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑如何快速投影到盒子或电视上看视频电脑
- 下一篇: openmp 互斥锁 mysql_ope