在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 交错数组

C# 交错数组表示一个表格数据&#xff0c;行确定&#xff0c;但是每一行的列数不同&#xff0c;那么这个时候就可以使用交错数组。交错数组的本质是1个一维数组&#xff0c;只不过这个一维数组的元素的类型是一个数组。交错数组的声明元素的类型[] [] 数组的名称 new 元素的类…

QQ群群排名如何进行SEO优化?

QQ群排名有多个方面&#xff0c;比如你的qq群名称&#xff0c;人数&#xff0c;还有活跃度等等&#xff0c;很多因素影响你的群排名。下面给大家讲解如何做到搜索第一。第一&#xff1a;群名称群名称一定要和你搜索的关键词相匹配&#xff0c;比如我建的一个粉丝群“爱嵩阁”&a…

编辑器漏洞手册

简介 #2014年8月21日 最初的手册版本&#xff0c;是由北洋贱队的各位朋友收集整理。时隔4年&#xff0c;我们再次整理了这些文件。目的是希望这种传统能延续下去。我们相信&#xff1a;星星之火可以燎原。希望大家能多提建议&#xff0c;完善这份手册。 #2010年某月某日 创建这…

iOS学习 NSString常用技巧

字符串是程序设计最常用的数据类型之一了。在Mac/iPhone编程中&#xff0c;苹果为我们提供了一个不同的字符串类型NSString。有别与普通的String为数据类型&#xff0c;NSString其实是一个对象类型。NSString是NSObject(Cocoa Foundation的基础对象)的子类&#xff0c;所以具有…

Flash不同版本的下载安装及必要的系统组件未正常运行的解决办法

在一个外包平台刷入职培训视频&#xff0c;类似于慕课的课程&#xff0c;需要安装Flash才能播放。一般推荐谷歌浏览器&#xff0c;值得注意的是2020年12月&#xff0c;谷歌浏览器将不再支持flash flash官网 安装步骤 在百度搜索"flash"&#xff0c;点击Flash中国官…

UEditor 任意文件上传漏洞

1 漏洞简介 1.1 漏洞描述 Ueditor是百度开发的一个网站编辑器&#xff0c;目前已经不对其进行后续开发和更新&#xff0c;该漏洞只存在于该编辑器的.net版本。其他的php,jsp,asp版本不受此UEditor的漏洞的影响&#xff0c;.net存在任意文件上传&#xff0c;绕过文件格式的限制…

如何设计类和接口

本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题&#xff0c;包括对象创建&#xff0c;并发&#xff0c;序列化&#xff0c;反射等。 它将指导您完成Java掌握的过程&#xff01; 在这里查看 &#xff01; 目录 1.简…

HDU 3072 SCC Intelligence System

给出一个带权有向图&#xff0c;要使整个图连通。SCC中的点之间花费为0&#xff0c;所以就先缩点&#xff0c;然后缩点后两点之间的权值为最小边的权值&#xff0c;把这些权值累加起来就是答案。 1 #include <iostream>2 #include <cstdio>3 #include <algorith…

再见,Springboot和SpringCloud

Java中说到微服务肯定离不开Spring Boot和Spring Cloud&#xff0c;这两者到底有什么关系&#xff0c;什么是微服务&#xff0c;如果单纯的说SpringBoot&#xff0c;SpringCloud&#xff0c;都是不准确的&#xff0c;那应该怎么回答。官网对于Spring Boot的介绍Spring Boot mak…

通过暴露出来的OA和github信息拿Shell

本文转载于https://xz.aliyun.com/t/10392 记一次授权渗透测试 一&#xff1a;信息收集阶段 因为目标是学校&#xff0c;一般会去考虑收集学号&#xff0c;教工号。因为有的登陆点需要此类信息&#xff0c;且密码存在规律性&#xff08;身份证后六位&#xff0c;123456&#xf…

表格内容排序(js实现)

http://tablesorter.com/docs/转载于:https://www.cnblogs.com/sunflower627/p/4718688.html

手机上可以编程看代码的软件

以后大家会在路上看到很多人拿着手机,他不是在聊天,他有可能是运维工程师、也可能是算法开发、也可能是java开发,还可能是客户端开发,也可能是前端开发... 让你编程一直在路上,这到底是程序员的福音,还是码农的枷锁。 粉丝提问: 这里介绍几款可以在手机上编程的app,分…

给你的执行力马上充值

“执行力就是在既定的战略和愿景的前提下,组织对内外部可利用的资源进行综合协调,制定出可行性的战略,并通过有效的执行措施从而最终实现组织目标、达成组织愿景的一种力量。执行力是一个变量,不同的执行者在执行同一件事情的时候也会得到不同的结果。执行力不但因人而异,而且还…

性能,可伸缩性和活力

本文是我们学院课程中名为Java Concurrency Essentials的一部分 。 在本课程中&#xff0c;您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识&#xff0c;并学习诸如原子性&#xff0c;同步和线程安全之类的概念。 在这里查看 &#xff01; 目录 1.简介 2.表现…

Java 压缩解压字符串(支持中文)

public static void main(String[] args) throws Exception{ String str "xflush3.0个人感觉最大的特点就是监控配置非常灵活&#xff0c;从日志的格式定义、收集、配置&#xff0c;都可以自定义&#xff1b;这样对于老应用的打点日志&#xff0c;不需要关心规则的定义就可…

BurpSuite v2021.8.2安装使用

文章前言 几个月之前&#xff0c;Burpsuit官方发布了BurpSuite v2021.8.2&#xff0c;但是迟迟没有时间来试试手&#xff0c;正好借着这次调休的时间来写写文章&#xff0c;顺便更新一下Burpsuite 软件下载 天翼云盘 极速安全 家庭云|网盘|文件备份|资源分享 软件安装 Step 1&a…

程序员赚钱资源汇总,结合自己亲身经历

知识计算机知识深入理解计算机系统-必修课&#xff0c;NB学校的NB课程的NB教材代码大全-&#xff08;不要被这个名字吓到&#xff0c;英文叫做 Code complete&#xff09;微软的书&#xff0c;几乎可以当作是软件工程的百科全书。很少有人完全精通甚至完成这本书中所有部分的学…

Hive高级用法汇总

1. 根据字符串分割实现一行变多行 关键字&#xff1a;LATERAL VIEW&#xff0c; explode&#xff0c;split SELECT ad_time_slice_index, SUM(impression_count) FROM base_tracking_logs LATERRAL VIEW EXPLODE(SPLIT(ad_time_slices,\\,)) adalias AS ad_time_slice_index WH…

Agrona的Threadsafe堆外缓冲区

这篇博客文章解释了我们如何为线程安全操作轻松提供对堆内存的访问&#xff0c;从而继续了我在Agrona库上进行的系列文章 。 在继续进行之前&#xff0c;我可能应该警告一下&#xff0c;这是一个相当高级的主题&#xff0c;并且我不会尝试解释诸如内存屏障之类的概念&#xff0…

逍遥模拟器配置burpsuite抓包环境

电脑与逍遥模拟器处于同一网段&#xff0c;在burpsuite中设置代理&#xff1a; 之后在逍遥模拟器中设置网络代理 之后直接下载下面的证书并且将其拖放到逍遥模拟器中&#xff1a; 证书下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1qJmcKcVj3NqmrWKf6zb83g …