在Hibernate中使用存储过程
生活随笔
收集整理的這篇文章主要介紹了
在Hibernate中使用存储过程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文介紹了從休眠狀態調用存儲過程的不同方法。 JDBC操作將不涉及。 PostgreSQL將用作數據庫。
CREATE DATABASE example;CREATE TABLE company (company_id BIGSERIAL PRIMARY KEY,name TEXT NOT NULL );CREATE TABLE benefit (benefit_id BIGSERIAL PRIMARY KEY,name TEXT,company_id BIGINT,CONSTRAINT fk_company FOREIGN KEY (company_id)REFERENCES company (company_id) MATCH SIMPLE );CREATE TABLE employee (employee_id BIGSERIAL PRIMARY KEY,first_name TEXT,last_name TEXT,company_id BIGINT,CONSTRAINT fk_company FOREIGN KEY (company_id)REFERENCES company (company_id) MATCH SIMPLE );CREATE TABLE employee_benefit (employee_id BIGINT,benefit_id BIGINT,CONSTRAINT fk_employee FOREIGN KEY (employee_id)REFERENCES employee (employee_id) MATCH SIMPLE ,CONSTRAINT fk_benefit FOREIGN KEY (benefit_id)REFERENCES benefit (benefit_id) MATCH SIMPLE );INSERT INTO company (name) VALUES ('TestCompany'); INSERT INTO employee (first_name, last_name, company_id) VALUES ('Emmanouil','Gkatziouras',1); INSERT INTO benefit (name,company_id) VALUES ('gym',1); INSERT INTO benefit (name,company_id) VALUES ('lunch',1);我們的postgresql函數將返回一組員工福利:
CREATE OR REPLACE FUNCTION add_all_company_benefits(employeeId BIGINT,companyid BIGINT)RETURNS TABLE(benefit_id BIGINT,name TEXT,company_id BIGINT) AS $$DECLARE benefitid BIGINT;BEGINFOR benefitid IN (SELECT benefit.benefit_id FROM benefit WHERE benefit.company_id=companyid) LOOPIF (SELECT COUNT(*) FROM employee_benefit as ebWHERE eb.employee_id=employeeidAND eb.benefit_id=benefitid) = 0THENINSERT INTO employee_benefit (employee_id, benefit_id)VALUES (employeeId,benefitId);END IF;END LOOP;RETURN QUERYSELECT benefit.benefit_id,benefit.name,benefit.company_id FROM benefitINNER JOIN employee_benefit ON employee_benefit.benefit_id = benefit.benefit_idWHERE employee_benefit.employee_id=employeeId;END; $$ LANGUAGE plpgsql;使用JPA批注的實體映射如下:
公司實體
package com.gkatzioura.example.entity;import javax.persistence.*; import java.util.HashSet; import java.util.Set;@Entity @Table(name = "company") public class Company {@Id@GeneratedValue@Column(name = "company_id")private Long Id;@ColumnString name;@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY,mappedBy = "company")private Set<Benefit> benefits = new HashSet<Benefit>();public Long getId() {return Id;}public void setId(Long id) {Id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<Benefit> getBenefits() {return benefits;}public void setBenefits(Set<Benefit> benefits) {this.benefits = benefits;} }員工實體
package com.gkatzioura.example.entity;import javax.persistence.*;@Entity @Table(name = "employee") public class Employee {@Id@GeneratedValue@Column(name = "employee_id")private Long id;@Column(name = "first_name")private String firstName;@Column(name = "last_name")private String lastName;@ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY)@JoinColumn(name = "company_id",referencedColumnName = "company_id")private Company company;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Company getCompany() {return company;}public void setCompany(Company company) {this.company = company;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;} }利益實體
package com.gkatzioura.example.entity;import javax.persistence.*;@Entity @Table(name = "benefit") public class Benefit {@Id@GeneratedValue@Column(name = "benefit_id")private Long id;@Column(name = "name")private String name;@ManyToOne@JoinColumn(name = "company_id")private Company company;public String getName() {return name;}public void setName(String name) {this.name = name;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Company getCompany() {return company;}public void setCompany(Company company) {this.company = company;} }我們的第一種方法是通過將過程作為休眠sql查詢來調用。
Session session = sessionFactory.openSession();List<Company> companies = session.createCriteria(Company.class).add(Restrictions.eq("name", companyName)).list();List<Employee> employees = session.createCriteria(Employee.class).add(Restrictions.eq("firstName",employeeName)).list();for(Company company:companies) {for(Employee employee:employees) {LOGGER.info("The company is "+company.getId()+" the employee is "+employee.getId());SQLQuery query = (SQLQuery) session.createSQLQuery("SELECT*FROM add_all_company_benefits(:employeeId,:companyId)").addEntity(Benefit.class).setParameter("employeeId", employee.getId()).setParameter("companyId", company.getId());List result = query.list();for(Integer i=0;i<result.size();i++) {LOGGER.info("The benefit is "+((Benefit) result.get(i)).getName());}}}session.close();我們將通過在公司實體中添加NameQuery來更新公司實體。
@Entity @Table(name = "company") @NamedNativeQueries({@NamedNativeQuery(name = "AddAllCompanyBenefits",query = "SELECT*FROM add_all_company_benefits(:employeeId,:companyId)",resultClass = Benefit.class) }) public class Company { }我們的休眠行為將重構為:
Query query = session.getNamedQuery("AddAllCompanyBenefits").setParameter("employeeId", employee.getId()).setParameter("companyId", company.getId());List result = query.list();for(Integer i=0;i<result.size();i++) {LOGGER.info("The benefit is "+((Benefit) result.get(i)).getName()); }另一種方法是使用hibernate的ProcedureCall,該程序用于hibernate的JPA的StoredProcedureQuery的實現:
ProcedureCall procedureCall = session.createStoredProcedureCall("add_all_company_benefits"); procedureCall.registerParameter("EMPLOYEE", Long.class, ParameterMode.IN); procedureCall.registerParameter("COMPANY", Long.class, ParameterMode.IN); procedureCall.getParameterRegistration("EMPLOYEE").bindValue(employee.getId()); procedureCall.getParameterRegistration("COMPANY").bindValue(company.getId()); ProcedureOutputs procedureOutputs = procedureCall.getOutputs(); ResultSetOutput resultSetOutput = (ResultSetOutput) procedureOutputs.getCurrent();List results = resultSetOutput.getResultList();for(Integer i=0;i<results.size();i++) {Object[] objects = (Object[]) results.get(i);LOGGER.info("The benefit is "+objects[1]); }翻譯自: https://www.javacodegeeks.com/2015/08/use-stored-procedures-with-hibernate.html
總結
以上是生活随笔為你收集整理的在Hibernate中使用存储过程的全部內容,希望文章能夠幫你解決所遇到的問題。