如果在复杂查询中使用休眠模式,则需要使用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

休眠:在sqlRestriction上使用联接表别名相关推荐

  1. hibernate 别名_Hibernate:在sqlRestriction上使用联接表别名

    hibernate 别名 如果在复杂查询的情况下使用Hibernate模式,则需要使用sql. 因此,sqlRestrictions可以解决. 但是,对联接表别名使用sql限制有点棘手. 将有三个表: ...

  2. mysql 查询 表别名_MySQL-复杂查询及条件-起别名-多表查询-04

    基本查询语句及方法 测试数据创建 如果在windows系统中,插入中文字符,select的结果为空白,可以将所有字符编码统一设置成gbk(或者参照我安装配置MySQL的博客,将所有字符编码设置为 ut ...

  3. java cell报错_有一个小小点问题,现在我想从eclipse上读取Excel表

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 有一个小小点问题,现在我想从eclipse上读取Excel表,但是sheet的方法getcell报错,请问这是哪儿的错呢?谢谢 源码及报错图片如下: pa ...

  4. mysql union all 别名_MySQL Union合并查询数据及表别名、字段别名用法分析

    本文实例讲述了MySQL Union合并查询数据及表别名.字段别名用法.分享给大家供大家参考,具体如下: union关键字 SELECT s_id, f_name, f_price FROM frui ...

  5. 将某个目录上的Excel表,导入到数据库中.sql

    --将某个目录上的Excel表,导入到数据库中 --将所有的Excel文件放到一个目录中,假设为c:\test\,然后用下面的方法来做 create table #t(fname varchar(26 ...

  6. SpringMVC的请求-文件上传-客户端表单实现

    文件上传客户端表单需要满足: 表单项type="file" 表单的提交方式是post 表单的enctype属性是多部分表单形式,及enctype="multipart/f ...

  7. vueform表单文件上传_峰哥说技术系列-8.Spring Boot文件上传(Form表单和Ajax方式)

    今日份主题 Spring Boot文件上传(Form表单和Ajax方式) 在Spring Boot中,和文件上传的主要和MultipartResolver接口有关,他有两个实现类 StandardSe ...

  8. Android之解决PC端上传http表单格式文件手机解析文件名乱码问题和PC浏览器下载文件的文件名显示乱码问题

    1 问题 问题1. 手机写socket作为服务器,PC浏览器上传http表单格式文件,然后手机端解析携带中文的文件名我解析是乱码. 问题2. 手机写了socket作为服务器,PC浏览器下载文件,但是浏 ...

  9. [html] 页面上的登录表单记住了密码(显示星号),但我又忘了密码,如何找回这个密码呢?

    [html] 页面上的登录表单记住了密码(显示星号),但我又忘了密码,如何找回这个密码呢? 将密码input的type改为text或者为空,则会显示输入框值. 个人简介 我是歌谣,欢迎和大家一起交流前 ...

最新文章

  1. php的udp数据传输,python实现udp数据报传输的方法
  2. 动态SQL应用(成绩排名)
  3. java并发编程系列-内存模型基础
  4. WebForms 开发基础
  5. mysql 主机类型_实现在别的电脑上访问主机的mysql
  6. 【重点EI会议推荐】机器学习主题方向论文征稿:2021计算机、物联网与控制工程国际学术会议(CITCE 2021)...
  7. CF757F-Team Rocket Rises Again【最短路,DAG支配树】
  8. lodash 根据某个字段排序处理
  9. PyQt4设置窗口左上角的小图标
  10. 如何删除计算机中的“天翼云盘”图标
  11. Java学完哪些内容能够出去找工作
  12. java rhino js类_Rhino -- 基于java的javascript实现
  13. 教你如何做好移动支付行业
  14. python获取豆瓣高分电影写入MYSQL+matplotlib简单可视化
  15. tensorflow最新版本与keras版本对应
  16. html恶搞之无限弹窗
  17. strstr函数用法小结
  18. 如何理解充分条件和必要条件
  19. php搞笑证件,摆摊证制作软件app 摆摊证搞笑图片怎么做
  20. python数据分析复盘——爬虫相关库

热门文章

  1. ssm使用全注解实现增删改查案例——DeptMapperImpl
  2. Hibernate中使用Criteria查询及注解——(HibernateUtil)
  3. java实现九九乘法表的输出
  4. html5圆形旋转菜单js,jquery 圆形旋转图片滚动切换效果
  5. oracle修改redolog路径,oracle修改redo log files路径
  6. tomcat(11)org.apache.catalina.core.StandardWrapper源码剖析
  7. java安全 ——JAAS(Java 认证和授权服务)开发指南
  8. 自底向上伸展树(之字形旋转+一字形旋转)
  9. restful和rest_HATEOAS的RESTful服务:JVM上的REST API和超媒体
  10. java使用迭代器删除元素_使用Java从地图中删除元素