休眠:在sqlRestriction上使用联接表别名

如果在复杂查询中使用休眠模式,则需要使用sql。
因此,sqlRestrictions可以解决。 但是,对联接表别名使用sql限制有点棘手。

将有三个表:

  • 公司表。
  • 员工表。
    每个员工都属于一家公司,因此我们有多对一的关系。
  • 福利表。
    每个公司都有很多好处,因此我们有一对多的关系。

本示例将使用Postgresql。

CREATE DATABASE example;CREATE TABLE company (company_id SERIAL PRIMARY KEY,name TEXT NOT NULL
);CREATE TABLE employee (employee_id SERIAL PRIMARY KEY,first_name TEXT,last_name TEXT,company_id integer,CONSTRAINT fk_company FOREIGN KEY (company_id)REFERENCES company (company_id) MATCH SIMPLE
);CREATE TABLE benefit (benefit_id SERIAL PRIMARY KEY,name TEXT,company_id integer,CONSTRAINT fk_company FOREIGN KEY (company_id)REFERENCES company (company_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);

JPA将用于实体配置。

公司实体。

package com.gkatzioura.example.entity;import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;/*** Created by gkatziourasemmanouil on 7/12/15.*/
@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.*;/*** Created by gkatziourasemmanouil on 8/2/15.*/
@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.*;/*** Created by gkatziourasemmanouil on 8/9/15.*/@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;}
}

休眠配置

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- Database connection settings --><property name="connection.driver_class">org.postgresql.Driver</property><property name="connection.url">jdbc:postgresql://127.0.0.1:5432/example</property><property name="connection.username">postgres</property><property name="connection.password">postgres</property><!-- JDBC connection pool (use the built-in) --><property name="connection.pool_size">1</property><!-- SQL dialect --><property name="dialect">org.hibernate.dialect.PostgreSQL9Dialect</property><!-- Enable Hibernate's automatic session context management --><property name="current_session_context_class">thread</property><!-- Disable the second-level cache  --><property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property><!-- Echo all executed SQL to stdout --><property name="show_sql">true</property><!-- Drop and re-create the database schema on startup --><property name="hbm2ddl.auto">update</property><mapping class="com.gkatzioura.example.entity.Company"/><mapping class="com.gkatzioura.example.entity.Employee"/><mapping class="com.gkatzioura.example.entity.Benefit"/></session-factory></hibernate-configuration>

创建休眠会话工厂的主类

package com.gkatzioura.example;import com.gkatzioura.example.entity.Employee;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import org.hibernate.sql.JoinType;
import org.hibernate.type.StringType;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** Created by gkatziourasemmanouil on 7/12/15.*/
public class Main {private static SessionFactory sessionFactory;private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(SessionFactory.class);public static void main(String args[]) {sessionFactory = buildSessionFactory();getByCompanyAndBenefit("TestCompany","gym");sessionFactory.close();}public static SessionFactory buildSessionFactory() {return new Configuration().configure().buildSessionFactory();}}

假设我们要通过公司名称和特定的福利名称来提取员工,我们将添加getByCompanyAndBenefit函数。

公司名称将通过常规限制进行过滤。

但是,福利名称将由sqlRestriction过滤。

private static List<Employee> getByCompanyAndBenefit(String companyName,String benefitName) {Session session = sessionFactory.openSession();Criteria criteria = session.createCriteria(Employee.class,"employee");Criteria companyCriteria = criteria.createCriteria("company",JoinType.INNER_JOIN);companyCriteria.add(Restrictions.eq("name", companyName));Criteria benefitsAlias = companyCriteria.createCriteria("benefits",JoinType.LEFT_OUTER_JOIN);benefitsAlias.add(Restrictions.sqlRestriction("{alias}.name = ?",benefitName, StringType.INSTANCE));List<Employee> employees = criteria.list();for(Employee employee:employees) {LOGGER.error("The employee is "+employee.getFirstName());}session.close();return employees;}

对关系使用条件的createCriteria函数时,{alias}表示新条件的关联实体。

对于使用createAlias之后检索到的条件类,这是不可能的。

最后但并非最不重要的gradle文件。

group 'com.gkatzioura.example'
version '1.0-SNAPSHOT'apply plugin: 'application'
apply plugin: 'java'
apply plugin: 'idea'mainClassName = "com.gkatzioura.example.Main"sourceCompatibility = 1.8repositories {mavenLocal()mavenCentral()
}dependencies {testCompile group: 'junit', name: 'junit', version: '4.11'compile 'org.ancoron.postgresql:org.postgresql.net:9.1.901.jdbc4.1-rc9'compile 'org.slf4j:slf4j-api:1.6.6'compile 'ch.qos.logback:logback-classic:1.0.13'compile 'org.hibernate:hibernate-core:4.3.6.Final'compile 'org.hibernate:hibernate-entitymanager:4.3.6.Final'compile 'org.hibernate:hibernate-validator:5.1.1.Final'compile 'dom4j:dom4j:1.6.1'compile 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final'testCompile group: 'junit', name: 'junit', version:'3.8.1'}

翻译自: https://www.javacodegeeks.com/2015/08/hibernate-use-join-table-alias-on-sqlrestriction.html

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

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

相关文章

android 批量查找view,Android Recyclerview实现多选,单选,全选,反选,批量删除的功能

效果图如下:recyclerview 实现多选,单选,全选,反选,批量删除的步骤1.在recyclerview布局中添加上底部的全选和反选按钮,删除按钮,和计算数量等控件2.这里选中的控件没有用checkbox来做,用的是imageview,选中和不选中其实是两张图片3.默认是不显示选中的控件的,点击编辑的时候显…

盘点和程序员相关的那些事,让你不再被割韭菜,薅羊毛!

如今的我们处在一个信息爆炸的时代&#xff0c;光埋头苦恼的闭门造车已经不能满足我们程序员的日常开销啦&#xff0c;因此需要密切关注和自己相关的那些事&#xff01; 目录 1.成功绝非偶然 2.你们公司几号发工资就代表你公司所处的级别 3.各大公司HR对学历的评价&#xff1…

转:fopen与open可以转换吗

绝对不可以。fopen是C运行库级别的函数&#xff0c;而open是system call的wrapper routine。fopen返回FILE *的指针&#xff0c;这个结构本身维护着一些关于这个文件的信息&#xff0c;而open返回的是这个被打开的文件的id&#xff0c;这个id是内核来维护的。这两个东西根本不是…

微信抢红包

今晚就过年了,相信很多朋友在微信群能收到很多红包,但是过年可能吃的更重要。比如我~ 那么你需要如下一款软件。 那就是让你在百忙之中,都不会错过任意一个红包,也就是微信的抢红包神器。 我也是心血一热,想找个软件代替自己领红包,于是就找了找,并且试验了一波,确实是…

diy一个android手机版下载,原神个人自制版

原神个人自制版是一款十分有意思的自由探索游戏&#xff0c;用户在这里能看到不少的游戏角色&#xff0c;你需要做的就是不断的发挥出自己的“能力”&#xff0c;让游戏中的角色全部的到达你的队伍中。当然这里还有着不少的武器&#xff0c;等着用户的不断的寻找。原神个人自制…

dart语言和java语言_Java不是文明语言吗?

dart语言和java语言几周前&#xff0c;我有机会学习iOS编程。 我的老板认为我更像是“计算机科学家”&#xff0c;而不是开发人员&#xff0c;这意味着我可以将自己的知识应用于开发一两个iPad应用程序–我要做的就是学习Objective-C&#xff0c; iOS SDK&#xff1a;到底有多难…

linux备份用户权限

1:切换root用户&#xff0c;进入home目录&#xff0c;执行以下命令: [rootlocalhost home]# ll /home/wangfajun 2: home目录下执行以下命令进行wangfajun用户的权限备份&#xff1a; [rootlocalhost home]# getfacl -R wangfajun/ >permission.bak3: 改变权限&#xff0c;并…

微信限量纪念版code封面来啦,速看领取方式

临近春节&#xff0c;微信红包封面掀起了一阵热潮 前几天官方在开放平台出来这个活动。 是不是感觉这个封面特别的COOL&#xff0c;以代码的形式展示微信红包封面&#xff0c;鉴于大家如此的渴望这款封面&#xff0c;孙叫兽熬夜给大家制作10份。 预览一下效果&#xff1a; …

华为鸿蒙osbeta在哪看发布会,重磅消息!华为在发布鸿蒙OS2.0手机beta版本后,又发布搭载鸿蒙的新品!!...

原标题&#xff1a;重磅消息&#xff01;华为在发布鸿蒙OS2.0手机beta版本后&#xff0c;又发布搭载鸿蒙的新品&#xff01;&#xff01;就在12月16号华为刚刚发布鸿蒙OS2.0beta系统手机版本后&#xff0c;就在今天华为又举行了一个新品发布会&#xff0c;他就 是华为家庭智能和…

内存中数据模型和大数据持久性

ORM框架在希望与关系数据库进行交互时可以帮助开发人员。 对于关系数据库&#xff0c;有许多出色的ORM框架&#xff0c;例如Hibernate和Apache OpenJPA&#xff0c;其中一些确实很棒。 如今&#xff0c;大数据正在涌现&#xff0c;越来越多的人开发在大数据上运行的应用程序。…

UVALive 6525 Attacking rooks 二分匹配 经典题

题目链接&#xff1a;点击打开链接 题意&#xff1a; 给定n*n的棋盘&#xff0c; 能够在.上摆 象棋中的车&#xff08;X是墙壁&#xff09; 使得随意两个车都不能互相攻击到 问&#xff1a;最多能摆多少个车。 思路&#xff1a; 二分匹配 1、若没有X。那么做法就是 X点集为行&a…

CSDN主页下如何添加访客地图?

有大佬在付费专栏作者群提问这个问题,我们先来研究一下哈。 先看聊天记录吧 放大效果 这位博主是如何实现的呢? 我拿到了这个博客的地址,使用谷歌浏览器F12,拿到这部分代码。他这个是在自定义模块添加访问地图。 自定义模块需要是博客专家,企业博客或者VIP才可以编辑。只…

html 适配 android,Android 版本适配 6~11

android 6.0 : 权限动态申请(仅限危险权限)android 7.0: 应用间共享文件(FileProvider); signature versions (v1,v2全部勾选)android 8.0 : 通知栏 &#xff1b; 静态广播被限制使用 &#xff1b;去除允许未知来源安装通知栏&#xff1a;通知渠道级别(例如广告…

lucene_indexWriter说明、索引库优化

IndexWriter Hibernate的SessionFactory在Hibernate中。一般保持一个数据库就仅仅有一个SessionFactory。由于在SessionFactory中维护二级缓存&#xff0c;而SessionFactory又是线程安全的。所以SessionFactory是共享的。lucene的IndexWriter假设同一时候在一个索引库中同一时候…

600W个微信红包封面,人人都能领取到!!!

过年啦&#xff0c;祝大家春节快乐牛年大吉&#xff0c;万事如意&#xff01;别忘了春节还有红包封面领取新的一年愿大家财运亨通&#xff01;新年过完了&#xff0c;整理情绪上班了&#xff0c;祝福没有断&#xff0c;问候也依然。努力工作多表现&#xff0c;年后年终奖永远把…

android 二次绘制 layout,View的三次measure,两次layout和一次draw

我在《Android视图结构》这篇文章中已经描述了Activity,Window和View在视图架构方面的关系。前天&#xff0c;我突然想到为什么在setContentView中能够调用findViewById函数&#xff1f;View那时不是还没有被加载&#xff0c;测量&#xff0c;布局和绘制啊。然后就搜索了相关的…

mule esb 集成_集成框架比较– Spring集成,Mule ESB或Apache Camel

mule esb 集成公司之间的数据交换增加了很多。 必须集成的应用程序数量也增加了。 这些接口使用不同的技术&#xff0c;协议和数据格式。 然而&#xff0c;这些应用程序的集成应以标准化的方式建模&#xff0c;有效实现并由自动测试支持 。 JVM环境中提供了三个可满足这些要求的…

盘点关于程序员的那些经典案例

深度剖析几个经典话题&#xff0c;以图文的形式展现&#xff0c;好好看图。 目录 1. 2014互联网职场薪酬报告&#xff01;你拖后腿了吗&#xff1f; 2. 月薪8K程序员现身说法&#xff1a;男人就该默默做技术&#xff01; 3.项目建设 4. 2014年亿级用户下的新浪微博平台架构…

html中文字过长 自动隐藏,css 实现文字过长自动隐藏功能

单行overflow: hidden;text-overflow: ellipsis;white-space: nowrap;多行(兼容各个浏览器)//通过覆盖最后几个字的形式p{position:relative;line-height:1.4em;height:4.2em;/* 3 倍line-height 多少倍就是多少行*/overflow:hidden;}.p::after {content:"...";font-…

写博客和生产api的工具

前言&#xff1a; .不要乱管闲事 写博客&#xff1a; 印象中是叫writeAlive之类的工具&#xff1b; 生产api的&#xff1a; 似乎叫hignLight的工具&#xff1b;转载于:https://www.cnblogs.com/zhangzs000/p/5273346.html