通过昨天的学习和晚上上自习时候的练习对 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();
相关推荐
传智播客JPA实战详解:日期、枚举等复杂字段类型的映射与应用
有些时候,数据库字段长度受限,或者对接的老系统只认缩写码,比如:枚举值希望存为ACTIVEAINACTIVEISUSPENDEDS这时候就得祭出终极武器——@Converter@Override@Override// 使用这样一来,Java层用语义清晰的枚举,数据库层用紧凑编码,完美兼顾可读性与兼容性 ✨回顾整个旅程,我们经历了:从→ 到从→ 到或自定义转换器。
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....
JPA的关系映射和JPQL查询
1.关系映射 1)多对一 ManyToOne(@ManyToOne) Class Order{ @ManyToOne Customer customer ; 2)一对多 @OneToMany(targetEntity=Order.class,mappedby=“customer”) OneToMany(@OneToMany) Class Customer{ @OneToM
JPA中实现sql的group_concat函数
前提条件:一个售后订单会有多个快递单号,一条记录存储一个快递单号,所以要根据售后订单分组,拼接快递单号,sql语句中,可以通过group by分组,然后用group_concat函数拼接快递单号,但JPA中没有对应group_concat函数的方法 解决办法:使用StringTemplate StringTemplate stringTemplate = Expressions.stringTemplate("group_concat({0})", qAsOrderPackageEntity.mail
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 的情况会比较...
专辑:JPA详解视频教程
简介:JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用的对象持久化的开发工作,实现ORM的统一。JPA作为一项对象持久化的标准,不但可以获得Java EE应用服务器的支持,还可以直接在Java SE中使用。JPA必将成为Java持久化解决方案的主流,如果你是...
Spring Data JPA
一、JPA概述及基本操作 1、ORM思想 ORM(Object-Relational Mapping) 表示对象关系映射。 目的:通过操作实体类就可以对数据库表进行操作 建立两个映射: 实体类和表的映射 实体类属性和表中字段的映射 实现ORM思想的框架:Hibernate、mybatis 2、JPA的介绍 Hibernate封装jdbc,是一个orm关系对象映射框架,可以自动生成sq...
Spring JPA复杂查询-基础
1、Specifications动态查询 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationExecutor接口查询。相比JPQL,其优势是类型安全,更加的面向对象。 import java.util.List; import org.springframework.data.domai...
ORM思想 JDBC规范 hibernate Jpa规范 Spring Data Jpa
本篇文章为黑马程序员传智播客的记录,方便自己复习 简单介绍: ORM思想: Object Relationship Mapping -----对象关系映射 目的:操作POJO(实体类)等价于操作数据库的表 ①POJO类和表的映射关系 ②POJO类中属性与表中字段的映射关系 JDBC: 只需要修改一下连接接口的规则和其他的少量的地方即可使用多个数据库 hibernate: 一个开源的对象关系映射框架,他对JDBC进行了非常轻量级的对象封装,他将POJO(实体类)与数据库的表建立映射关系,是一个全自动的OR
01_传智播客JPA详解_全面阐释和精彩总结JPA
01_传智播客JPA详解_全面阐释和精彩总结JPA
spring4.x+springdatajpa+springmvc+maven搭建
springdatajpa让数据访问更轻便,直接封装数据访问的代码,简化代码编写.不需要写sql语句,也不需要配置维护关系的xml文件,直接调用底层方法就能实现数据库的增删改查,功能堪称完美
JPA 使用@OneToMany
一对多一个人对多张卡,但是一张卡只能对应一个人,典型的一对多关系,下面就用OneToMany来自动生成sql语句首先建表s_person和s_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...
Entity Bean (6):JPQL [转]
JPQL就是一种查询语言,具有与SQL 相类似的特征,JPQL是完全面向对象的,具备继承、多态和关联等特性,和hibernate HQL很相似。 查询语句的参数JPQL语句支持两种方式的参数定义方式: 命名参数和位置参数。。在同一个查询语句中只允许使用一种参数定义方式。 命令参数的格式为:“: +参数名”例:Query query = em.createQuery
JPA 使用@OneToOne
OneToOne,就是一对一映射,现实生活中比较常见的例子就是一个人有一个身份证,一个丈夫只能有一个老婆新建一个Person和Address类@Entity @Table(name="s_person") public class Person { @GeneratedValue(generator = "uuid2") @GenericGenerator(name = "u...
JPQL详解
前提 最近在改bug的时候发现了自己的缺点,在改前端bug的时候非常顺利顺手。但是在改后端bug的时候如果遇到不是太难的问题还可以解决,但是一到难点感觉自己就懵逼! 所以讲解了关于JPQl相关内容 JPA 在说jpql之前必须要说一下什么是JPA,否则在后续学习的时候,你会弄混的。JPA是一种规范,什么是规范呢,规范就是一个钥匙可以开这把锁。一般对于规范来说我们都是用接口,如果有人要...
JPA 和 QueryDSL
spring boot-jpa整合QueryDSL 参考地址 QueryDSL和 JPA分别是什么,为什么合起来用 最近写项目,使用到了 Jpa 这个 ORM 规范支持,使用注解的方式实现 Sql ,但是用过 Jpa 的同学都知道 Jpa 对于单表操作很灵活,但是对于复杂一些的 SQL 就是很不友好了,所以这个地方我们就用到了 QueryDSL 来实现复杂的 Sql 总结:JPA可以通过注解方式...
JPA总结——实体关系映射(一对一@OneToOne)
原文地址:JPA总结——实体关系映射(一对一@OneToOne)作者:阿飞 注意:本文出自“阿飞”的博客 ,如果要转载本文章,请与作者联系! 并注明来源: http://blog.sina.com.cn/s/blog_49fd52cf0100s0y7.html 一对一(@OneToOne) · 单向关联 # 注释@OneToOne定义如下: @Target({MET
876




被折叠的 条评论
为什么被折叠?



