JPA:LEFT JOIN 在hql语句中使用
JPA:LEFT JOIN 在hql语句中使用
- 背景
- 表结构
- Hpl语句
背景
Springboot 项目中,人员表关联公司的组织架构树的,人员可以再多个部门。这时候就需要连表查询,使用left join,因为jpa知道两张表中的关系,所以不需要使用on 。
表结构
@Data
@Entity
@ApiModel(value = "企业员工实体类")
@Accessors(chain = true)
@javax.persistence.Table(name = MemberEntity.TABLE_NAME, indexes = {@Index(name = "index_mobile", columnList = "mobile")})
@org.hibernate.annotations.Table(appliesTo = MemberEntity.TABLE_NAME, comment = "公司人员表") //表注释
public class UserEntity extends BaseEntity implements Serializable {/*** tableName*/public static final String TABLE_NAME = "u_user_tbl";/*** UUID*/private static final long serialVersionUID = 959562203894894703L;/*** 姓名*/@NotBlank(message = "姓名不能为空")@Size(min = 0, max = 64, message = "姓名名过长")@ApiModelProperty(value = "姓名", required = true)@Column(length = 64)private String name;/*** 用户对应的角色信息*/@ManyToMany(fetch = FetchType.EAGER)//立即从数据库中进行加载数据;@JoinTable(name = "m_user_role_tbl", //中间表的表名joinColumns = {@JoinColumn(name = "userId")}, //本表的主键inverseJoinColumns = {@JoinColumn(name = "roleId")}) //所映射表的主键@Where(clause = "enable = 0")private Set<RoleEntity> roles;/*** 分组*/@ElementCollection(fetch = FetchType.EAGER)@CollectionTable(name = "a_emp_group_tbl", //中间表的表名joinColumns = {@JoinColumn(name = "emp_id")}) //本表的主键列明@ApiModelProperty(value = "分组")private Set<Long> groups;
}
Hpl语句
/*** 获取HQL和拼装参数** @param findDTO* @param params* @return*/private String getHql(MemberFindDTO findDTO, Map<String, Object> params) {StringBuffer startHql = new StringBuffer("from MemberEntity t ");StringBuffer hql = new StringBuffer("");hql.append(" where t.enable = :enable ");params.put("enable", findDTO.getEnable());// left join查询 g.id 不用疑惑.就是他if (findDTO.getGroup() != null) {startHql.append(" left join t.groups g ");hql.append(" and g.id = :groupId ");params.put("groupId", findDTO.getGroup());}// 排序String orderBy = StringUtils.isNotBlank(findDTO.getOrderBy()) ? findDTO.getOrderBy() : "id desc";hql.append(" order by t." + orderBy);startHql.append(hql).toString();log.info("企业sql语句: {}",startHql.toString());return startHql.toString();}
打印出来的结果:
from UserEntity t left join t.groups g where t.enable = :enable and g.id = :groupId order by t.id desc
JPA:LEFT JOIN 在hql语句中使用相关推荐
- HQL语句中数据类型转换,及hibernate中createQuery执行hql报错
一.HQL语句中数据类型转换: 我们需要从数据库中取出序号最大的记录,想到的方法就是使用order by子句进行排序(desc倒序),然后取出第一个对象,可是当初设计数据库时(我们是在原来的数据库的基 ...
- 【Hibernate】Hql语句in中带参数的写法
在页面中通过自定义标签查询一个列表的多种状态的数据,如下,查状态为1和3的数据: [@s_icloud_resource_list count='8' orderBy='1' type='4' sta ...
- HQL语句的基本语法和使用
HQL查询 Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性 ,因此 H ...
- 三、通过session操作hibernate(hql语句)
在没有将spring和hibernate整合在一起的时候,要使用hibernate,在持久层需要如下步骤: 一.在还没有对hibernate进行spring的整合的时候,我们需要写一个session工 ...
- mysql hql查询语句_查询hql语句
Hibernate-HQL 了解HQL 一.HQL定义 1.Hibernate QueryLanguage,Hibernate查询语言 2.HQL是面向对象的查询语言 3.HQL提供了丰富灵活的查询特 ...
- mysql hql查询语句_使用Query进行HQL语句查询和SQL语句查询
HQL的语法比较简单,与普通SQL的区别之处是针对对象的不同,在查询语句中将sql中的表名替换成了sql中的持久化类名,因为hibernate机制是基于对象进行查询的. 不带参数的查询,语句是&quo ...
- Hibernate查询技术之HQL语句
1.session中的get( )和load( )方法来查询对象.但其查询功能有限. private void testGet(){//1.初始化,读取配置文件hibernate.cfg.xmlCon ...
- HQL语句的动态赋值
HQL语句的动态赋值 1."?"号代表参数 2.自定义参数名称 在JDBC编程中,PreparedStatement对象为开发提供了方便,他不但可以为动态语句进行赋值,而且可以避免 ...
- 简易HQL语句转换为可执行的SQL语句
主要利用Hibernate中封装的一个转换器实现类:QueryTranslatorImpl, hql语句中无参数时,用下面的方法: /** * 将hql语句转换为sql语句,无参数 * * @para ...
最新文章
- zabbix 概念理解
- itoa函数的递归实现(二级指针实现)
- (47)逆向分析 KiSystemService 函数填充 _KTRAP_FRAME 部分
- 面试无忧之Zookeeper总结心得
- 存储变革 IBM V5000四大优势助用户破旧立新
- 第一百二十五期:程序员的自我救赎,使用Python开发性格分析工具
- 文本标点英文对齐_电脑健盘中的所有英文组合意思超值解释建议收藏
- Leetcode 杂题
- 【华为敏捷/DevOps实践】3. 如何开好站立会议
- vue中对话框关闭以后清空对话框中input,select内容
- Android进阶学习方法总结(内附阿里P7进阶学习全套资料)
- Helm — Chart介绍
- 软件项目管理之历时估算(工程评估评审技术【Program Evaluation And Review Technique,PERT】)
- 如何根据函数,绘制出函数的图像
- JAVA后端面经总结
- 《Python基础教程》学习笔记——条件、循环及其他语句
- 【深度学习,NLP,LM】Alpaca-Lora ,Colab上部署与调用
- 架构设计之如何写架构设计说明书
- [计算机通信网络]以太网的帧格式详解
- 北邮计算机学院盲审名单,北京邮电大学