`

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=?

分享到:
评论

相关推荐

    JPA多对多Demo

    本示例中的“JPA多对多Demo”是一个具体的实践案例,展示了如何在JPA中实现多对多关联关系,以及对应的增删改查方法。 多对多关联是现实世界中常见的一种关系类型,例如教师和学生之间的关系,一个教师可以教多个...

    JPA分页查询与条件分页查询

    在实际的查询方法中,我们通常会定义一个继承自`JpaRepository`的接口,并且在这个接口中声明一个带有`Pageable`参数的方法,例如`Page&lt;VideoCategory&gt; findByCondition(SearchVo searchVo, Pageable pageable);...

    JPA复杂查询加分页查询的快速开发

    JPA 提供了分页查询功能,可以根据需要对查询结果进行分页处理。分页查询可以使用 Pageable 对象来实现。Pageable 对象提供了分页查询的相关信息,包括当前页码、每页记录数等。 JPA 复杂查询 JPA 复杂查询可以...

    springboot结合jpa实现分页,动态多条件查询

    现在,在Spring Boot的控制器中,我们可以处理HTTP请求,调用上面定义的查询方法并返回Thymeleaf模板。首先,创建一个`Pageable`对象以指定分页参数,然后使用`getUserSpec`创建`Specification`实例: ```java @...

    spring data jpa 的Specifications动态查询

    Spring Data JPA是Spring框架的一个模块,它简化了Java应用程序对数据库的操作,通过提供自动的repository接口实现。在处理复杂的查询需求时,Spring Data JPA的`Specifications`接口提供了动态构建查询的能力,允许...

    jpa例子jpajpa

    8. **多态性(Polymorphism)**: JPA支持继承和多态性,使得你可以定义一个基类,然后多个子类继承它并有自己的数据库表。 在"apache-openjpa-1.2.0-source"这个压缩包中,包含了Apache OpenJPA项目的源代码。Open...

    11_JPA详解_JPA中的一对多延迟加载与关系维护.zip

    本资料主要探讨的是JPA中的一对多关系以及延迟加载机制,这两部分是JPA使用中的关键概念。 **一对多关系** 在关系数据库中,一对多关系是最常见的一种关联类型。例如,一个部门可以有多名员工,而每个员工只能属于...

    11_传智播客JPA详解_JPA中的一对多延迟加载与关系维护

    例如,一个学生可以属于多个班级(多对一),而一个班级可以包含多个学生(一对多)。在JPA中,我们通过在实体类上使用`@OneToMany`注解来定义这种关系。这个注解允许我们将一个实体的集合属性映射到另一个实体的...

    09_JPA详解_使用JPQL语句进行查询.zip

    5. **关联(Associations)**:JPA支持一对一、一对多、多对一和多对多的关系映射。使用`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`注解来定义实体之间的关联。 6. **继承(Inheritance)**:JPA支持...

    JPA中实现双向多对多的关联关系示例代码

    本文将深入探讨在JPA中如何实现双向多对多的关联关系,并提供相关的示例代码。 首先,我们需要了解多对多关联关系的基本概念。在关系型数据库中,两个实体之间可能存在多对多的关系,意味着每个实例可以从一个实体...

    jpa的一对多和多对多代码

    通过上述代码,我们可以看到JPA如何优雅地处理一对多和多对多的关系,以及如何进行查询和操作。理解并熟练运用这些关系对于Java开发者来说至关重要,特别是在构建复杂的业务逻辑和数据模型时。在实践中,还需要注意...

    jpa查询详解

    jpa查询详解 JPA(Java Persistence API)是一种 Java 持久层 API,用于处理 Java 对象和关系数据库之间的 Mapping。JPA 查询是 JPA 中的一种重要机制,用于从数据库中检索数据。在本文中,我们将详细介绍 JPA 查询...

    jpa--9.单向多对一

    在Java Persistence API (JPA) 中,"单向多对一"关系是一种常见的对象关系映射(ORM)设计模式,用于表示实体之间的关联。在这个模式中,一个实体("多"端)可以引用另一个实体("一"端),但被引用的实体并不持有对...

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

    本篇文章将探讨如何在Ibatis3中融合JPA的方法进行查询,以实现更加灵活的数据访问。 首先,理解Ibatis3的核心概念。Ibatis3的主要组成部分包括SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession以及Mapper...

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

    "JPA多表复杂查询方法示例" JPA(Java Persistence API)是一种 Java 应用程序接口,用于访问、持久和管理关系数据库中的数据。在实际开发中,经常需要进行多表复杂查询,以下是JPA多表复杂查询方法示例的详细介绍...

    jpa单表递归树形结构实现

    通过定义自关联的实体类、配置JPA仓库以及编写适当的查询方法,可以轻松地实现对树形数据的CRUD操作。在实际应用中,还需考虑性能优化,如分页加载、懒加载等策略,以避免大量数据导致的效率问题。

    SpringDataJpa开发--继承JpaRepository实现简单条件查询

    除了基本的查询方法,`JpaRepository`还提供了其他一些高级查询功能,比如`findAll`, `findById`, `existsById`, `count`等。此外,还可以通过`Query`注解自定义更复杂的查询逻辑。 通过以上步骤,我们可以在Spring...

    优秀实践分享 Spring Data JPA2

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

    JPA大全之经典全集

    JPA详解通常是对JPA的深入解析,包括实体(Entity)、持久化上下文(Persistence Context)、托管状态(Managed State)、懒加载(Lazy Loading)、级联操作(Cascading)、关系映射(Relationship Mapping)、查询...

    Spring Data JPA 实现多表关联查询的示例代码

    对于多表关联查询,我们可以通过定义Repository接口并自定义查询方法来实现。 **一对一映射** 一对一映射通常用于两个实体之间存在唯一对应关系的情况。例如,`UserInfo`实体与`Address`实体的关系可能是一对一的...

Global site tag (gtag.js) - Google Analytics