jpa实现多对多的属性时查询的两种方法

目录
  • jpa多对多的属性查询
    • 第一:采用JPQL方式
    • 第二:采用specification 方法
  • JPA,HQL多对多的查询语句
    • Hql语句
    • 另外一种写法

jpa多对多的属性查询

第一:采用JPQL方式

使用@Query拼接jpql语句完成多对多的查询;

@query(
SELECT User FROM User u JOIN Student s on s.id = u.id where u.name LIKE :name
)
User findallByName(@param(“name”)String name);

第二:采用specification 方法

user中有List<student>属性,多对多的关系;

代码如下:

   Specification<Class> specification = new Specification<>(){
   @override
   public predicate toPredicate(Root<Class> root , CriteriaQuery<?> query ,CriteriaBuilder cb){
       List<Precidate> precidate = Lists.newArrayList<>();
       if(num>0){
       Predicate p1 = cb.equal(root.get("num").as(Integer.Class),count);
         precidate.add(p1);
       }
       if(channel > 0){
         ListJoin<User,Student> join= root.join(root.getModel().getList("student",student.class),JoinType.LEFT);
         Predicate p2 = cb.equal(join.get("id").as(Integer.Class));
         //这里面的join代表的是student,属于加入进来的部分,而不是链接表的全部结果;
         precidate.add(p2);
       }
       List<User> list = DAO.findAll(specification,new Sort(DESC,"id"));
}
}

JPA,HQL多对多的查询语句

一个老师教许多学生,一个学生被许多老师教,一个学生有好多书,同一种书被许多同学拥有.

要查询教拥有书"a"的学生的老师!

Hql语句

SELECT t FROM Teacher t join t.students s join s.books b where b.name = 'a' 

解释:t.students s中s并不是集合的意思,而是t的students对象的表别名,join t.students s这个hql,hibernate会翻译成两个表的内连接关系

错误写法:

SELECT t FROM teacher t where t.students.books.name = 'a' 

其实道理是很显然的,t.students是一个Set,那么这个Set怎么可能有books这样的属性呢?同理books.name也不对,所以使用表间连接并给出别名t.students s,此时的对象s才有books属性,所以可以写s.books b,最后使用b.name限制查询b.name = 'a'.

另外一种写法

SELECT t FROM Teacher t,Student s,Book b where s.id in elements(t.students) and b.id in elements(s.books)

这种方法没有出错!不过这种方式要用子查询!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • JPA如何设置表名和实体名,表字段与实体字段的对应

    目录 JPA设置表名和实体名,表字段与实体字段的对应 JPA数据库表实体命名规则 application.properties 写法 JPA设置表名和实体名,表字段与实体字段的对应 首先 你的jpaProperties配置项中要有 <prop key="hibernate.hbm2ddl.auto">update</prop> 这样就可以直接有对象映射为表结构,实现面向对象向数据库转化. 实体的名字可以和表名字不一样,字段名字和实体的名字也可以不一样. pack

  • JPA配置详解之jpaProperties用法

    目录 JPA配置之jpaProperties Sping Data Jpa配置问题 spring.jpa.properties.hibernate.hbm2ddl.auto=update JPA配置之jpaProperties <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmln

  • 详谈hibernate,jpa与spring data jpa三者之间的关系

    目录 前提 文字说明 CRUD操作 前提 其实很多框架都是对另一个框架的封装,我们在学习类似的框架的时候,难免会进入误区,所以我们就应该对其进行总结归纳,对比.本文就是对hibernate,jpa,spring data jpa三者之间进行文字对比,以及对其三者分别进行CRUD操作. 文字说明 Hibernate Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生

  • SpringBoot整合SpringDataJPA

    目录 SpringBoot整合JPA JPA & Spring Data JPA Hibernate & JPA 1.JPA 2.JPA & Hibernate 关系 Hibernate VS Mybatis 一.导入依赖 二.简单的CRUD 1.配置文件 2.实体类 3.Dao层 4.service层 5.controller 三.自定义SQL 四.分页查询 五.连表查询 六.分组查询 七.与mybatis对比 总结 SpringBoot整合JPA 使用数据库是开发基本应用的基础

  • Spring Data Jpa的四种查询方式详解

    这篇文章主要介绍了Spring Data Jpa的四种查询方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.调用接口的方式 1.基本介绍 通过调用接口里的方法查询,需要我们自定义的接口继承Spring Data Jpa规定的接口 public interface UserDao extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> 使用这

  • jpa实现多对多的属性时查询的两种方法

    目录 jpa多对多的属性查询 第一:采用JPQL方式 第二:采用specification 方法 JPA,HQL多对多的查询语句 Hql语句 另外一种写法 jpa多对多的属性查询 第一:采用JPQL方式 使用@Query拼接jpql语句完成多对多的查询; @query( SELECT User FROM User u JOIN Student s on s.id = u.id where u.name LIKE :name ) User findallByName(@param("name&qu

  • Spring Data JPA实现动态查询的两种方法

    前言 一般在写业务接口的过程中,很有可能需要实现可以动态组合各种查询条件的接口.如果我们根据一种查询条件组合一个方法的做法来写,那么将会有大量方法存在,繁琐,维护起来相当困难.想要实现动态查询,其实就是要实现拼接SQL语句.无论实现如何复杂,基本都是包括select的字段,from或者join的表,where或者having的条件.在Spring Data JPA有两种方法可以实现查询条件的动态查询,两种方法都用到了Criteria API. Criteria API 这套API可用于构建对数据

  • elasticsearch python 查询的两种方法

    elasticsearch python 查询的两种方法,具体内容如下所述: from elasticsearch import Elasticsearch es = Elasticsearch res1 = es.search(index="2018-07-31", body={"query": {"match_all": {}}}) print(es1) {'_shards': {'failed': 0, 'skipped': 0, 'suc

  • MySql逗号拼接字符串查询的两种方法

    下面两个函数的使用和FIND_IN_SET一样,使用时只需要把FIND_IN_SET换成FIND_PART_IN_SET或FIND_ALL_PART_IN_SET 例如某字段里是为1,2,3,4,5 使用方法: 第一种,传入1,3,6  可以查出来 select * from XXX where FIND_PART_IN_SET('1,3,6','1,2,3,4,5') 第二种,传入1,3,6  查不出来 select * from XXX where FIND_ALL_PART_IN_SET(

  • jQuery Dialog 打开时自动聚焦的解决方法(两种方法)

    下面给大家介绍两种方法解决jQuery Dialog 打开时自动聚焦问题.具体实现方法大家可以参考下本文. 方法一: p1_dialog_seniorSearch.dialog({ title:"高级查询", autoOpen:false,//默认关闭 modal: true,//开启遮罩层 width:570, height:330, buttons: { "查询":function(){ seniorSearch(1,20) } , "关闭"

  • spring boot @ResponseBody转换JSON 时 Date 类型处理方法【两种方法】

    spring boot @ResponseBody转换JSON 时 Date 类型处理方法[两种方法],Jackson和FastJson两种方式. spring boot @ResponseBody转换JSON 时 Date 类型处理方法 ,这里一共有两种不同解析方式(Jackson和FastJson两种方式) 第一种方式:默认的json处理是 jackson 也就是对configureMessageConverters 没做配置时 mybatis数据查询返回的时间,是一串数字,如何转化成时间.

  • Mysql实现模糊查询的两种方式(like子句 、正则表达式)

    目录 前言 语法 like子句 语法 示例 正则表达式 语法 说明: 示例 总结 通常在实际应用中,会涉及到模糊查询的需求,查询在 MySQL 中使用 SQL SELECT 命令来读取数据,有条件的查询可以在 SELECT 语句中使用 WHERE 子句来获取记录 有时候我们需要获取某字段含有 “xxxxx” 字符的所有记录,这时就是模糊查询,下面介绍一下在MySQL中实现模糊查询的两种方式 前言 MySQL 查询数据使用SQL SELECT语句 语法 MySQL数据库中查询数据通用的 SELEC

  • 通过JS和PHP两种方法判断用户请求时使用的浏览器类型

    在进行微信公众账号开发的时候,其中很大一块是微站点的开发,我们需要知道当前的浏览器是微信内置的浏览器,那么如何判断呢? 微信内置浏览器的 User Agent 如何判断微信内置浏览器,首先需要获取微信内置浏览器的User Agent,经过在 iPhone 上微信的浏览器的检测,它的 User Agent 是: Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko)

  • 用JS动态改变表单form里的action值属性的两种方法

    方法1: <form id="form1" name="form1" method="post" action="../news/index.asp"> <table width="100%" height="43" border="0" cellpadding="0" cellspacing="0">

  • laravel框架查询数据集转为数组的两种方法

    方法一: return DB::table('game_matchperiod')->select('starttime')->where('Type',$type)->get() ->map(function ($value) {return (array)$value;})->toArray(); 方法二: public function objToArr($object) { //先编码成json字符串,再解码成数组 return json_decode(json_en

随机推荐