日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

hibernate mysql 关联查询_Hibernate关联映射及高级查询

發(fā)布時(shí)間:2024/9/19 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hibernate mysql 关联查询_Hibernate关联映射及高级查询 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。