`

JPA多对多的查寻方法

    博客分类:
  • SHH
阅读更多

第一种方法:

比如有2个entity 
class A { 
  private List <B> bs; 


Class B { 

 

A表 
id, value 
1, AAA 
2, XXX 
B表 
id, value, AId 
1, BBB, 1 
2, CCC, 1 
3, DDD, 1

 

 

以下两种方法,即使出现null也不出错 
SELECT a FROM A a, In(a.bs) b WHERE a.value=XXX and b.value = BBB //光选A没问题 

SELECT b FROM A a, In(a.bs) b WHERE a.value=XXX and b.value = BBB //光选B没问题 

但是同时选a,b的时候就出错了,原因当时分析了一下,同时选a,b时 
即SELECT a, b FROM A a, In(a.bs) b WHERE a.value=XXX and b.value = BBB 
实际上JPA还是分步执行,即先选出a,然后在调用a.getB选出b,所以当没有满足A条件的a时,即a是null时,调用a.getB会出错的 
当然,只是根据异常信息推测,并没有证实

 

 

 

 

 

 

 

 

第二种方法:

多对多关联查询sql语句

1.student,score,coure的实体关联定义如下:

------------------------------------------------------------------------------------------------

Student:

@Entity
@Table(name="tb_student")
public class Student implements Serializable {

      .....
private Set<Course> courses=new HashSet<Course>();
private Set<Score> scores=new HashSet<Score>();

.....

@ManyToMany
@JoinTable(name="tb_student_course",
    joinColumns=@JoinColumn(name="student_id",referencedColumnName="id"),
    inverseJoinColumns=@JoinColumn(name="course_id",referencedColumnName="id")
    )
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}

@OneToMany(mappedBy="student")
public Set<Score> getScores() {
return scores;
}
public void setScores(Set<Score> scores) {
this.scores = scores;
}
}

-----------------------------------------------------------------------------------------------

Score:

@Entity
@Table(name="tb_score")
public class Score implements Serializable {

	
	
	@ManyToOne
	@JoinColumn(name="course_id")
	public Course getCourse() {
		return course;
	}
	public void setCourse(Course course) {
		this.course = course;
	}
	
	@ManyToOne
	@JoinColumn(name="student_id")
	public Student getStudent() {
		return student;
	}
	public void setStudent(Student student) {
		this.student = student;
	}
	
}
-------------------------------------------------------------------------------------------------

Course实体无关联注解。

--------------------------------------------------------------------------------------------------------------

student跟course是多对多单向,student可访问course

student跟score是一对多双向

score跟course是多对一单向,score可访问course

---------------------------------------------------------------------------------------------------------------

查找学生1所有课程的所有成绩:

public List<Score> findScoreByStudentId(Integer id) {
		List<Score> ls=em.createQuery("select score from Student s join s.scores score where s.id=:id")
                               .setParameter("id", id)
                               .getResultList();
		return ls;
	}

 

客户端:

                       ScoreDAO scoredao=(ScoreDAO)cxt.lookup("ScoreDAOBean/remote");
			List<Score> scores1=scoredao.findScoreByStudentId(new Integer(1));
			System.out.println("==查询学生1的所有科目成绩");
			for(Score s:scores1 ){
				
				System.out.println(s.getCourse().getName()+"--"+s.getScore());
			}


结果输出:

==查询学生1的所有科目成绩
course1--99.0
course2--98.0

 

sql输出:

22:21:07,765 INFO  [STDOUT] Hibernate: 
    select
        scores1_.id as id19_,
        scores1_.course_id as course4_19_,
        scores1_.student_id as student3_19_,
        scores1_.score as score19_ 
    from
        tb_student student0_ 
    inner join
        tb_score scores1_ 
            on student0_.id=scores1_.student_id 
    where
        student0_.id=?
22:21:07,765 INFO  [STDOUT] Hibernate: 
    select
        course0_.id as id18_0_,
        course0_.name as name18_0_,
        course0_.description as descript3_18_0_,
        course0_.optional as optional18_0_,
        course0_.teacher as teacher18_0_ 
    from
        tb_course course0_ 
    where
        course0_.id=?
22:21:07,765 INFO  [STDOUT] Hibernate: 
    select
        student0_.id as id20_1_,
        student0_.name as name20_1_,
        student0_.description as descript3_20_1_,
        student0_.class_id as class9_20_1_,
        student0_.temporary as temporary20_1_,
        student0_.age as age20_1_,
        student0_.sex as sex20_1_,
        student0_.birthday as birthday20_1_,
        student0_.createDate as createDate20_1_,
        classeo1_.id as id17_0_,
        classeo1_.classname as classname17_0_ 
    from
        tb_student student0_ 
    left outer join
        tb_class classeo1_ 
            on student0_.class_id=classeo1_.id 
    where
        student0_.id=?
22:21:07,781 INFO  [STDOUT] Hibernate: 
    select
        course0_.id as id18_0_,
        course0_.name as name18_0_,
        course0_.description as descript3_18_0_,
        course0_.optional as optional18_0_,
        course0_.teacher as teacher18_0_ 
    from
        tb_course course0_ 
    where
        course0_.id=?

 

默认及时加载???(不是对集合默认延迟加载吗?),JPQL将查询改为如下也可以:

public List<Score> findScoreByStudentId(Integer id) {
		List<Score> ls=em.createQuery("select s.scores from Student s  where s.id=:id")
                                 .setParameter("id", id)
                                 .getResultList();
		return ls;
	}
 
结果输出:
==查询学生1的所有科目成绩
course1--99.0
course2--98.0

 

 

输出的sql语句如下:

22:36:55,546 INFO  [STDOUT] Hibernate: 
    select
        scores1_.id as id19_,
        scores1_.course_id as course4_19_,
        scores1_.student_id as student3_19_,
        scores1_.score as score19_ 
    from
        tb_student student0_ 
    inner join
        tb_score scores1_ 
            on student0_.id=scores1_.student_id 
    where
        student0_.id=?
22:36:55,546 INFO  [STDOUT] Hibernate: 
    select
        course0_.id as id18_0_,
        course0_.name as name18_0_,
        course0_.description as descript3_18_0_,
        course0_.optional as optional18_0_,
        course0_.teacher as teacher18_0_ 
    from
        tb_course course0_ 
    where
        course0_.id=?
22:36:55,546 INFO  [STDOUT] Hibernate: 
    select
        student0_.id as id20_1_,
        student0_.name as name20_1_,
        student0_.description as descript3_20_1_,
        student0_.class_id as class9_20_1_,
        student0_.temporary as temporary20_1_,
        student0_.age as age20_1_,
        student0_.sex as sex20_1_,
        student0_.birthday as birthday20_1_,
        student0_.createDate as createDate20_1_,
        classeo1_.id as id17_0_,
        classeo1_.classname as classname17_0_ 
    from
        tb_student student0_ 
    left outer join
        tb_class classeo1_ 
            on student0_.class_id=classeo1_.id 
    where
        student0_.id=?
22:36:55,562 INFO  [STDOUT] Hibernate: 
    select
        course0_.id as id18_0_,
        course0_.name as name18_0_,
        course0_.description as descript3_18_0_,
        course0_.optional as optional18_0_,
        course0_.teacher as teacher18_0_ 
    from
        tb_course course0_ 
    where
        course0_.id=?

分享到:
评论

相关推荐

    spring data jpa 的Specifications动态查询

    spring data jpa 的Specifications动态查询 单条件查询 多条件查询 分页查询

    优秀实践分享 Spring Data JPA2

    JPA 方法名常用查询 JPA 使用@Query注解实现JPQL和本地自定义查询 JPA API 条件查询 (子查询,多表连接查询) JPA结合QueryDSL轻松完成复杂查询(自连接,多表连接查询) 参与文档: Pro JPA2中文版:精通Java持久化API ...

    JPA大全之经典全集

    此资源集成了相关的JPA资源,包括JPA官方文档 JPA详解 JPA批注参考 JPA应用……

    spring data jpa 教程

    包括:解析方法名称以自动生成查询、 NamedQueries、 @Query指定查询、本地查询、命名化参数、更新查询、创建查询的顺序等内容 第四章:客户化扩展JpaRepository 包括:讲述如何在JpaRepository基础上扩展我们自己...

    Spring Data JPA从入门到精通

    'SpringDataJPA从入门到精通'分为12章 内容包括整体认识JPA、JPA基础查询方法、定义查询方法、注解式查询方法、@Entity实例里面常用注解详解、JpaRepository扩展详解、JPA的MVC扩展REST支持、DataSource的配置、乐观...

    springboot使用JPA时间类型进行模糊查询的方法

    主要介绍了springboot使用JPA时间类型进行模糊查询的方法,需要的朋友可以参考下

    JPA的多表复杂查询的方法示例

    主要介绍了JPA的多表复杂查询的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    SpringBoot中使用Spring-data-jpa分页查询

    SpringBoot是一款基于Spring框架的开发框架,而Spring-data-JPA是在Hibernate的基础上实现JPA规范的ORM框架。...同时,也可以定义一些自定义的查询方法,例如findAllByName(String name, Pageable pag

    Spring jpa 中文参考文档

    JPA应用注解中文参考 使用 JPA 时,可以使用批注配置实体的 JPA 行为。批注是一种使用元数据修饰 Java 源代码的简单表达方法,它编译为相应的 Java 类文件,以便在运行时由 JPA 持续性提供程序解释以管理 JPA 行为。

    ibatis3中使用jpa的方法进行查询

    NULL 博文链接:https://xiaohuxiaoyu.iteye.com/blog/729073

    jpa操作mysql数据库

    此压缩包为一个eclipse上的jpa工程,其中包含了对MySql数据库的增删该,及分页查询。本工程只在main方法运行,没有页面展示

    spring data jpa 连接mysql8.x的一些问题梳理总结.docx

    前段时间MySQL5.X启动不了服务,网上查了很多方法也为解决,最后升级成8.X系列软件。使用spring data jpa 框架进行连接出现了很多问题,现对相关问题进行总结梳理

    使用Spring Data Jpa为我们提供的@EntityGraph.docx

    在很多情况下,我们使用Spring-Data- Jpa,一些简单的查询,我们都喜欢用定义方法查询,而不是写JPQL。JPA为我们提供了一组注解:使用Spring-Data- Jpa为我们提供的@EntityGraph,或@EntityGraph和@NamedEntityGraph...

    spring-boot-jpa-demo

    springboot-jpa 在https://git.oschina.net/didispace/SpringBoot-Learning 的chapter3-2-4基础上,增加分页、JpaRepository各种查询方法、一对一配置,一对多。

    spring-data-jpa

    JPA对于单表的或者简单的SQL查询非常友好,甚至可以说非常智能。他为你准备好了大量的拿来即用的持久层操作方法。甚至只要写findByName这样一个接口方法,他就能智能的帮你执行根据名称查找实体类对应的表数据,完全...

    让JPA的Query查询接口返回Map对象的方法

    下面小编就为大家分享一篇让JPA的Query查询接口返回Map对象的方法,具有很的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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

    本篇文章主要介绍了Spring Data JPA实现动态查询的两种方法,具有一定的参考价值,有兴趣的可以了解一下。

    spring date jpa

    Spring整合Spring Data JPA 的使用,包括三种的查询方式 借助接口中的定义好的方法完成查询 jpql的查询方式 方法名称规则查询

    spring-data-jpa-extra:带有模板动态查询的spring数据jpa(例如

    春天数据jpa额外使用jpa的spring数据更舒适我爱spring-data-jpa,她放开我的双手,粗鲁的方法很无聊! 然而,尽管她为我们提供了规范解决方案,但她在动态本机查询上并不完美,而且她的返回类型必须是一个实体,但是...

    spring_jpa后台管理程序框架

    本系统修改自若依后台管理系统,数据访问方式换成了spring jpa,单表增删改查完全不用写sql,使用jpa提供的方法就可以,只有需要多表关联查询时直接执行sql。同时后台代码整体重写一遍,做了简化。

Global site tag (gtag.js) - Google Analytics