Java Persistence API的简称 JPA


JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。

容器级特性的支持

JPA框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。

简单方便

JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释,JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易地掌握。JPA基于非侵入式原则设计,因此可以很容易地和其它框架或者容器集成。

查询能力

JPA的查询语言面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询

高级特性

JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。



@Test
void getBook() {
    Book book = Book.builder()
            .id(13)
            .name("程序")
            .description("think")
            .build();
    ExampleMatcher matcher = ExampleMatcher.matching()
            // .withIgnorePaths("id","name") // 忽略 id,name 字段
            .withIgnorePaths("id", "name")    // 忽略 id 字段,即不管 id 是什么值都不加入查询条件
            // .withMatcher("name", ExampleMatcher.GenericPropertyMatchers.contains())  // 全部模糊查询
            .withMatcher("name", m -> m.startsWith())    // 模糊查询匹配开头
            // .withMatcher("name",ExampleMatcher.GenericPropertyMatchers.exact())  // 精准匹配
            .withIgnoreCase("name")  // 忽略大小写
            .withMatcher("description", m -> m.endsWith())
            .withIgnoreNullValues();

    Example example = Example.of(book, matcher);
    boolean       exists  = bookRepository.exists(example);
    System.out.println("exists = " + exists);
}




@Test
public void testSpecificationQueryExists() {
    Specification specification = (root, query, builder) -> {
        // 获取比较属性
        Path id = root.get("id");
        return builder.equal(id, 4);
    };
    boolean exists = this.helpRepository.exists(specification);
    System.out.println(exists?"exists":"not exists");
}




@Test
public void testSpecificationMoreParam() {
    Specification specification = (root, query, criteriaBuilder) -> {
        //获取比较属性
        Path title   = root.get("title");
        Path content = root.get("content");
        //构造条件查询
        Predicate preTitle   = criteriaBuilder.equal(title, "123");
        Predicate preContent = criteriaBuilder.equal(content, "efg is help ...123 ... ");
        //与相连
        Predicate condition = criteriaBuilder.and(preTitle, preContent);
        return condition;
    };
    long count = this.helpRepository.count(specification);
    System.out.println("count = " + count);
    List helps = this.helpRepository.findAll(specification);
    helps.forEach((help) -> System.out.println(help));
}


@Test
public void testSpecificationLike() {
    Specification specification = (root, query, criteriaBuilder) -> {
        //获取比较属性
        Path title = root.get("title");
        //构建查询条件
        //Predicate condition  = criteriaBuilder.like(title.as(String.class), "%12__");
        Predicate     condition = criteriaBuilder.like(title.as(String.class), "%oo%");
        Path id        = root.get("id");
        // Predicate condition 1 = criteriaBuilder.lessThan(id.as(Integer.class), 5);
        //  criteriaBuilder.ge  相当于 >=
        //  criteriaBuilder.greaterThan  相当于 >
        //  criteriaBuilder.lt (lessThan)  相当于 <
        //  criteriaBuilder.notEqual  相当于 <>
        // Predicate condition 2 = criteriaBuilder.notEqual(id.as(Integer.class), 5);
        return condition;
    };
    List helps = this.helpRepository.findAll(specification);
    helps.forEach(help -> System.out.println(help));
}




Specification 表达式 :


Specification.png




评论

 常用规则速查 
-------------------------------------------------------------- 
1   And    并且 
2   Or      或 
3   Is,Equals    等于 
4   Between      两者之间 
5   LessThan      小于 
6   LessThanEqual     小于等于 
7   GreaterThan     大于 
8   GreaterThanEqual   大于等于 
9   After    之后(时间) > 
10  Before    之前(时间) < 
11  IsNull        等于Null 
12  IsNotNull,NotNull   不等于Null 
13  Like    模糊查询。查询件中需要自己加 % 
14  NotLike     不在模糊范围内。查询件中需要自己加 % 
15  StartingWith  以某开头 
16  EndingWith    以某结束 
17  Containing   包含某 
18  OrderBy  排序 
19  Not    不等于 
20  In     某范围内 
21  NotIn    某范围外 
22  True    真 
23  False    假 
24  IgnoreCase  忽略大小写

2025-02-20 12:28:58

 
  7. columnDefinition属性:columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用,如果数据库中表已经建好,该属性没有必要使用 
  8. table属性:table属性定义了包含当前字段的表名。 
  9. length属性:length属性表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。 
 10. precision属性和scale属性:precision属性和scale属性一起表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。 
    具体如下: 
   1.double类型将在数据库中映射为double类型,precision和scale属性无效。 
   2.double类型若在columnDefinition属性中指定数字类型为decimal并指定精度,则最终以columnDefinition为准。 
   3.BigDecimal类型在数据库中映射为decimal类型,precision和scale属性有效。 
   4.precision和scale属性只在BigDecimal类型中有效。 
  
3.@Column 标注的columnDefinition属性: 表示该字段在数据库中的实际类型.通常 ORM 框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是TIMESTAMP.此外,String的默认映射类型为VARCHAR,如果要将 String 类型映射到特定数据库的 BLOB 或TEXT字段类型。

2024-11-21 21:36:51

@Column: 
 
1.当实体的属性与其映射的数据库表的列不同名时需要使用@Column标注说明,该属性通常置于实体的属性声明语句之前,还可与 @Id 标注一起使用。 
 
2.@Column 标注的常用属性是name,用于设置映射数据库表的列名。此外,该标注还包含其它多个属性,如:unique、nullable、length、precision等。具体如下: 
 
  
  1. name属性:name属性定义了被标注字段在数据库表中所对应字段的名称。 
  2. unique属性:unique属性表示该字段是否为唯一标识,默认为false,如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table注解中的@UniqueConstraint 
  3. nullable属性:nullable属性表示该字段是否可以为null值,默认为true。 
  4. insertable属性:insertable属性表示在使用”INSERT”语句插入数据时,是否需要插入该字段的值。 
  5. updateable属性:updateable属性表示在使用”UPDATE”语句插入数据时,是否需要更新该字段的值。 
  6. insertable和updateable属性:一般多用于只读的属性,例如主键和外键等,这些字段通常是自动生成的。 
 

2024-11-21 21:36:29

 JPA注解 
 
@Entity:@Table(name=”“):表明这是一个实体类。一般用于jpa这两个注解一般一块使用,但是如果表名和实体类名相同的话,@Table可以省略 
 
@MappedSuperClass:用在确定是父类的entity上。父类的属性子类可以继承。 
 
@NoRepositoryBean:一般用作父类的repository,有这个注解,spring不会去实例化该repository。 
 
@Column:如果字段名与列名相同,则可以省略。 
 
@Id:表示该属性为主键。 
 
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = “repair_seq”):表示主键生成策略是sequence(可以为Auto、IDENTITY、native等,Auto表示可在多个数据库间切换),指定sequence的名字是repair_seq。 
 
@SequenceGeneretor(name = “repair_seq”, sequenceName = “seq_repair”, allocationSize = 1):name为sequence的名称,以便使用,sequenceName为数据库的sequence名称,两个名称可以一致。 
 
@Transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic。@Basic(fetch=FetchType.LAZY):标记可以指定实体属性的加载方式 
 
@JsonIgnore:作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。 
 
@JoinColumn(name=”loginId”):一对一:本表中指向另一个表的外键。一对多:另一个表指向本表的外键。 
 
@OneToOne、@OneToMany、@ManyToOne:对应hibernate配置文件中的一对一,一对多,多对一。,double类型将在数据库中映射为double类型,precision和scale属性无效

2024-11-21 21:33:30

在单向关系中没有mappedBy,因此使用@JoinColumn建立外键关联,建立外键的一端即是主控方,主控方相当于拥有指向另一方的外键的一方。 
 
JoinColumn 
一对一和多对一的@JoinColumn注解的都是在“主控方”,都是本表指向外表的外键名称。 
一对多的@JoinColumn注解在“被控方”,即一的一方,指的是外表中指向本表的外键名称。一般只有单向关系才在“被控方”中使用@JoinColumn,双向关系使用mappedBy。 
多对多中,@JoinColumn写的都是本表在中间表的外键名称,inverseJoinColumns写的是另一个表在中间表的外键名称。 
mappedBy 
mappedBy用于指定具有双向关系的两个实体中哪个实体是被关联处理的,使用mappedBy的一方是被控制的,另一方是主控方。 
 
特点 
只有OneToOne、OnetoMany、ManyToMany上才可以有mappedBy属性; 
在@OneToMany注解中,mappedBy表示:由One的一方指向Many的一方;mappedBy的值为Many方中定义的One方类型的字段,即主控方中定义的被控方的对象名; 
关系的主控方,即Many方负责维护关系,在主控方用@JoinColumn建立外键; 
mappedBy与JoinColumn和JoinTable总是互斥的,不能同时出现在一方; 
FetchType.LAZY和FetchType.EAGER区别 
FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载; 
FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载;

2024-11-16 14:25:35

JPA-CascadeType四个属性的讲解 
--------------------------------------------------------------------------------------- 
 
 
CascadeType.PERSIST:级联新增(又称级联保存):对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法。 
 
例子:只有A类新增时,会级联B对象新增。若B对象在数据库存在则抛异常 
 
CascadeType.MERGE:级联合并(级联更新):若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法 。 
例子:指A类新增或者变化,会级联B对象(新增或者变化) 
 
CascadeType.REMOVE:级联删除:对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法。 
 
例子:REMOVE只有A类删除时,会级联删除B类; 
 
CascadeType.REFRESH:级联刷新:获取order对象里也同时也重新获取最新的items时的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据。 
 
CascadeType.ALL:以上四种都是。 
 
 

2024-11-16 14:03:03

主要算法: 
------------------------------------------------------------ 
(1)Trie 
 
(2)ngram 
 
(3)B + 树 
------------------------------------------------------------

2024-11-15 19:23:34

SpringDataJPA -07- example的基本使用  
https://blog.csdn.net/qq_44766883/article/details/107130474 
 
 
QueryByExampleExecutor接口的查询 
https://blog.csdn.net/zhao_tuo/article/details/78604324

2024-11-15 12:22:54

  • 1

编程爱好者 © 2021 - 2024