传智播客--JPA的关系映射和JPQL查询

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

通过昨天的学习和晚上上自习时候的练习对 JPA 有了一定的了解,对学好 JPA 有了很大的信心.呵呵...在学一门新技术的时候,总是感觉它很难可能学不会.这技术有多高深啊,不好掌握.可是每次学完了回头一看,又感觉原来如此啊, 其实不是想的那样.哈哈...还是经验少啊.下面对今天的学习内容总结一下.

1.关系映射
1)多对一
ManyToOne(@ManyToOne)
Class Order{
@ManyToOne
Customer customer ;
2)一对多
@OneToMany(targetEntity=Order.class,mappedby=“customer”)
OneToMany(@OneToMany)
Class Customer{
@OneToMany(mappedBy=“”)
Set<Order> orders = ..
}

设置多对一的级联:@ManyToOne(cascade=CascadeType.PERSIST)
3)多对一自连接映射
@ManyToOne
@JoinColumn(name=“parent_id”,//外键名称
        referencedColumnName=“id”)//当前表主键
Category parentCategory;
4)一对一
@OneToOne
  class User{
    @OneToOne
    protected Addr addr;

  class Addr{
    @OneToOne(mappedBy=“addr", optional="false");
    protected User user;
  }
5)One-to-one关联
外键关联:
使用@JoinColumn[单向]
  class User{
    @OneToOne
    @JoinColumn(name=“addr_id", referencedColumnName=“addrid",updatable=false)
    protected Addr addr;
 name指定在用户表中的外键名称.如果没有指定,则生成的外键字段形式如下:
  <relationship字段/属性名>_<对端表的主键名>
  若双向关联的话:
  @Entity
  public class Addr {
    @OneToOne(mappedBy=“addr”)//控制权问题
    protected User user;
主键关联:
One-to-one关联,地址表是自然主键
使用 @PrimaryKeyJoinColumn
  class User{
    @OneToOne
    @PrimaryKeyJoinColumn(name="userid", referencedColumnName=“addrid")
    protected Addr addr;
PrimaryKeyJoinColumn的name属性指定当前表的主键名, referenced-ColumnName属性指定关联表中的外键名称.referencedColumnName默认值属性名_主键名
   public class Addr {
     @Id//自然主键
     @Column(name=“userid")private Integer id ;
     //@oneToOne(mapped="addr") protected User user;
主键关联时,一定要先插入User,然后手动为Addr指定id才可保存.
6)多对多
  @ManyToMany
  protected Set<Student> students;

  @ManyToMany(mappedBy=“students")
  protected Set<Teacher> teachers;
7)联合主键
@JoinTable(name="jpa_teas_stus_links",
joinColumns=
  {@JoinColumn(name=“sno1",referencedColumnName=“no1"),
   @JoinColumn(name=“sno2",referencedColumnName=“no2"),
   @JoinColumn(name=“sno3",referencedColumnName=“no3")}
inverseJoinColumns=
  {@JoinColumn(name=“tno1", referencedColumnName=“no1")),
   @JoinColumn(name=“tno2", referencedColumnName=“no2")),
   @JoinColumn(name=“tno3", referencedColumnName=“no3"))}
  protected Set<Stud> studs;

  @ManyToMany(mappedBy="items")
  protected Set<Teacher> teachers;
8)级联删除
@ManyToMany(mappedName=“teachers”,cascade=CasCadeType.REMOVE)
Set<Student> ..

Em.remove(teacher.class,new CompID(a,b,c));..

2.JPA继承关系
单表策略:所有的信息存放到一个表中(区分符子段)
  @Entity
  @Table(name=“ess")
  @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
  @DiscriminatorColumn(name=“etype",
            discriminatorType=DiscriminatorType.STRING, length=2)
  public abstract class Employee{..}

  @Entity
  @DiscriminatorValue(value=“he")
  public class HE extends Employee

  @Entity
  @DiscriminatorValue(value=“se")
  public class SE extends Employee

3.实体状态:
四种状态
  New (transient): 创建出来没关联,没有id,没有记录
  Managed (persistent): 和当前context关联的实体
  Detached: 有id,但不和上下文关联(evict).
  Removed: 有id,不和上下文关联,计划从库中删除.
 
4.持久化相关操作
  em.persist(fritz);
  em.find( Cat.class, new Long(catId) );
  em.getReference(Parent.class, parentId);
  em.flush();
  em.refresh(cat);
  entityManager.find(Seller.class, sellerId);
联合主键检索:
  SellerPK sellerKey = new SellerPK();
  sellerKey.setFirstName(firstName);
  sellerKey.setLastName(lastName);
  Seller seller = entityManager.find(Seller.class, sellerKey);
更新实体
  O o = em.find(..)
  o.setXXX(..);
添加实体:
  em.persist(..);
合并实体:
  em.merge(..);//更新游离对象
删除实体
  entityManager.remove(entityManager.merge(order));
remove只操作托管的实体,如果传递一个游离实体的话,将抛出非法参数异常.
  @OneToMany(cascade=CascadeType.REMOVE)//级联删除
  //Flush控制清理
  em.setFlushMode(FlushModeType.COMMIT);
  em.flush();
  //Refresh
  em.refresh(entity);

5.JPQL查询
1)简单查询 :
  Query query = em.createQuery("SELECT c FROM Customer c");
  return query.getResultList();
2)命名查询
  @Entity
  @NamedQuery(name = "findCustomerByName",
              query = "SELECT c FROM Customer c
                                WHERE c.name
                                LIKE :name ")
  class Category{..}
  //定义多个命名查询条件
  @NamedQueries({@NamedQuery(..), @NamedQuery(..)});
  em.createNamedQuery("findAllCustomers")
3)分页
  query = em.createNamedQuery("findCustomerByName");
  query.setParameter("name", "t,om");
  query.setMaxResults(10);
  query.setFirstResult(3);
  List customers = query.getResultList();
4)设置参数:
  SELECT o FROM Order i WHERE i.orderNo = ?1
  query.setParameter(1, 100.00);

  SELECT o FROM Order i WHERE o.price = :price
  query.setParameter("price", 100.00);
5)单个实体检索
  query.getSingleResult();
6)使用实体名
  @Entity(name = "CustomerEntity")
  public class Category
  FROM CustomerEntity [as] c
7)查询集合 :
  WHERE c.orders IS EMPTY
  WHERE CONCAT(c.fname, c.lname) = 't,om'
  SELECT c.id, c.name FROM Customer c
8)多态查询
  SELECT c FROM Customer c WHERE c.name LIKE :name
9)分组
  SELECT o.customer, COUNT(o.id) FROM Order o GROUP BY o.customer
10)排序
  order by
11)子查询
  SELECT o FROM Order I WHERE o.customer IN
  (SELECT c FROM Customer c WHERE c.name LIKE ?1)
12)连接
  SELECT o,c FROM Order o, Customer c WHERE o.customer.id = c.id
  SELECT o FROM Order o [INNER] JOIN o.customer //内连接
  SELECT c FROM Customer c LEFT OUTER JOIN c.orders//外连接
  SELECT c FROM Customer c FETCH JOIN c.orders//迫切连接
13)批量更新/删除
  UPDATE Customer c SET c.age = ?1 WHERE c.id >=?2
  query.setParameter(1, 12);
  query.setParameter(2, 5);
  int results = query.executeUpdate();

SpringData JPA进阶查询JPQL/原生SQL查询、分页处理、部分字段映射查询 上一篇介绍了入门基础篇SpringDataJPA访问数据库。本篇介绍SpringDataJPA进一步的定制化查询,使用JPQL或者SQL进行查询、部分字段映射、分页等。本文尽量以简单的建模与代码进行展示操作,文章比较长,包含查询的方方面面。如果能耐心看完这篇文章,你应该能使用SpringDataJPA应对大部分的持久层开发需求。如果你需要使用到动态条件查询,请查看下一篇博客,专题介绍SpringD 阅读详情

相关推荐

传智播客JPA实战详解:日期、枚举等复杂字段类型的映射与应用

有些时候,数据库字段长度受限,或者对接的老系统只认缩写码,比如:枚举值希望存为ACTIVEAINACTIVEISUSPENDEDS这时候就得祭出终极武器——@Converter@Override@Override// 使用这样一来,Java层用语义清晰的枚举,数据库层用紧凑编码,完美兼顾可读性与兼容性 ✨回顾整个旅程,我们经历了:从→ 到从→ 到或自定义转换器。

weixin_34640289的博客 876

JPA学习总结(三)--JPAOneToMany双向关联

NULL 博文链接:https://lc2586.iteye.com/blog/721309

传智播客——JPA学习笔记

传智播客——JPA学习笔记 网络上有一份pdf格式的《JPA学习笔记》,但是内容排版有点乱,而且有缺失的部分,小弟从原来的blog处拷贝出来,并加以排版,制作成了chm格式的,大家应该知道chm格式比较适合作为参考资料或帮助文档的文件格式了。

JPA框架下使用group_concat函数

前景:JPQL语句中没有group_concat关键字,因此需要使用原生代码去写sql. 业务场景:对group by分组后的同类字段进行合并以,进行分割 需要以上这种效果 开始实现 @Query(nativeQuery = true, value = "select c.id as clazzId,c.name as clazzName,GROUP_CONCAT(cr....

qq_24985201的博客 4535

JPA关系映射JPQL查询

1.关系映射  1)多对一  ManyToOne(@ManyToOne) Class Order{ @ManyToOne Customer customer ; 2)一对多  @OneToMany(targetEntity=Order.class,mappedby=“customer”) OneToMany(@OneToMany) Class Customer{ @OneToM

抬头30°的微笑的专栏 1286

JPA中实现sql的group_concat函数

前提条件:一个售后订单会有多个快递单号,一条记录存储一个快递单号,所以要根据售后订单分组,拼接快递单号,sql语句中,可以通过group by分组,然后用group_concat函数拼接快递单号,但JPA中没有对应group_concat函数的方法 解决办法:使用StringTemplate StringTemplate stringTemplate = Expressions.stringTemplate("group_concat({0})", qAsOrderPackageEntity.mail

sout的博客 1573

JPQL的一些用法

关联(join) JPQL仍然支持SQL中类似的关联语法: left out join/left join inner join left join fetch/inner join fetch left out join/left join等,都是允许符合条件的右边表达式中的Entiies 为空(需要显式使用left join/left outer join 的情况会比较...

shzqiang的专栏 313

专辑:JPA详解视频教程

简介:JPA用于整合现有的ORM技术,可以简化现有Java EEJava SE应用的对象持久化的开发工作,实现ORM的统一。JPA作为一项对象持久化的标准,不但可以获得Java EE应用服务器的支持,还可以直接在Java SE中使用。JPA必将成为Java持久化解决方案的主流,如果你是...

171

Spring Data JPA

一、JPA概述及基本操作 1、ORM思想 ORM(Object-Relational Mapping) 表示对象关系映射。 目的:通过操作实体类就可以对数据库表进行操作 建立两个映射: 实体类表的映射 实体类属性表中字段的映射 实现ORM思想的框架:Hibernate、mybatis 2、JPA的介绍 Hibernate封装jdbc,是一个orm关系对象映射框架,可以自动生成sq...

USTSD的博客 108

Spring JPA复杂查询-基础

1、Specifications动态查询 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationExecutor接口查询。相比JPQL,其优势是类型安全,更加的面向对象。 import java.util.List; import org.springframework.data.domai...

ZHONGZEWEI的博客 498

ORM思想 JDBC规范 hibernate Jpa规范 Spring Data Jpa

本篇文章为黑马程序员传智播客的记录,方便自己复习 简单介绍: ORM思想: Object Relationship Mapping -----对象关系映射 目的:操作POJO(实体类)等价于操作数据库的表 ①POJO类表的映射关系 ②POJO类中属性与表中字段的映射关系 JDBC: 只需要修改一下连接接口的规则其他的少量的地方即可使用多个数据库 hibernate: 一个开源的对象关系映射框架,他对JDBC进行了非常轻量级的对象封装,他将POJO(实体类)与数据库的表建立映射关系,是一个全自动的OR

BOWWOB的博客 330

01_传智播客JPA详解_全面阐释精彩总结JPA

01_传智播客JPA详解_全面阐释精彩总结JPA

spring4.x+springdatajpa+springmvc+maven搭建

springdatajpa让数据访问更轻便,直接封装数据访问的代码,简化代码编写.不需要写sql语句,也不需要配置维护关系的xml文件,直接调用底层方法就能实现数据库的增删改查,功能堪称完美

JPA 使用@OneToMany

一对多一个人对多张卡,但是一张卡只能对应一个人,典型的一对多关系,下面就用OneToMany来自动生成sql语句首先建表s_persons_card表s_card表然后在创建一张表关联两张表的关系s_person_card,P_ID为s_person的id,C_ID为s_card的id建Person.java实体类@Entity @Table(name="s_person") public cl...

穷水叮咚的博客 4万+

Entity Bean (6):JPQL [转]

 JPQL就是一种查询语言,具有与SQL 相类似的特征,JPQL是完全面向对象的,具备继承、多态关联等特性,hibernate HQL很相似。 查询语句的参数JPQL语句支持两种方式的参数定义方式: 命名参数位置参数。。在同一个查询语句中只允许使用一种参数定义方式。 命令参数的格式为:“: +参数名”例:Query query = em.createQuery

Tomson Xu 4479

JPA 使用@OneToOne

OneToOne,就是一对一映射,现实生活中比较常见的例子就是一个人有一个身份证,一个丈夫只能有一个老婆新建一个PersonAddress类@Entity @Table(name="s_person") public class Person { @GeneratedValue(generator = "uuid2") @GenericGenerator(name = "u...

穷水叮咚的博客 3万+

JPQL详解

前提 最近在改bug的时候发现了自己的缺点,在改前端bug的时候非常顺利顺手。但是在改后端bug的时候如果遇到不是太难的问题还可以解决,但是一到难点感觉自己就懵逼! 所以讲解了关于JPQl相关内容 JPA 在说jpql之前必须要说一下什么是JPA,否则在后续学习的时候,你会弄混的。JPA是一种规范,什么是规范呢,规范就是一个钥匙可以开这把锁。一般对于规范来说我们都是用接口,如果有人要...

Judy-命中注定与众不同 2万+

JPA QueryDSL

spring boot-jpa整合QueryDSL 参考地址 QueryDSL JPA分别是什么,为什么合起来用 最近写项目,使用到了 Jpa 这个 ORM 规范支持,使用注解的方式实现 Sql ,但是用过 Jpa 的同学都知道 Jpa 对于单表操作很灵活,但是对于复杂一些的 SQL 就是很不友好了,所以这个地方我们就用到了 QueryDSL 来实现复杂的 Sql 总结:JPA可以通过注解方式...

飘然生的博客 4402

JPA总结——实体关系映射(一对一@OneToOne)

原文地址:JPA总结——实体关系映射(一对一@OneToOne)作者:阿飞 注意:本文出自“阿飞”的博客 ,如果要转载本文章,请与作者联系! 并注明来源: http://blog.sina.com.cn/s/blog_49fd52cf0100s0y7.html 一对一(@OneToOne) · 单向关联 # 注释@OneToOne定义如下: @Target({MET

thiswj的专栏 934
上一篇: 传智播客--JPA的CRUD操作,映射实体
下一篇: 传智播客--EJB
getclass
博客等级 码龄17年 53粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值