添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

使用jpa去生成对应的值的长度和默认值是如何设置的呢

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String name() default "";
    boolean unique() default false;
    boolean nullable() default true;
    boolean insertable() default true;
    boolean updatable() default true;
    String columnDefinition() default "";
    String table() default "";
    int length() default 255;
    int precision() default 0;
    int scale() default 0;
  • name 属性用来设置字段的名字
  • unique用于设置这个字段是否是是唯一的
  • insertable和updatable、table都是和表更新相关的操作,
  • length 指定长度,默认是255
  • precision 数据长度
  • scale小数的长度
  • columnDefinition 指定这一列的信息

String

string是最常见的字段,

@Column(name = “name”)
private String name;

SQL中 name varchar(255)
生成的字段长度为255,即如果不设置长度的话默认的长度就是255个。

@Column(name = “name”,length = 50)
private String name;

name varchar(50)

@Column(name = “name”,columnDefinition=“varchar(11) COMMENT ‘用户姓名’”)
private String name;

name varchar(11) COMMENT ‘用户姓名’

在这里插入图片描述
这里不仅指定了长度,还给列了一个注释,便于查看

@Column(name = “name”,columnDefinition=“default ‘12345’”)
private String name;

如果我们制定默认值,这样SQL语句就会报错

create table user (id bigint not null, age integer, birth datetime(6), name default ‘12345’, sex bit, primary key (id)) engine=InnoDB

如果我们制定长度呢

@Column(name = “name”,columnDefinition=“default ‘12345’”,length = 25)
private String name;

运行的DDL语句依然无法创建出表

create table user (id bigint not null, age integer, birth datetime(6), name default ‘12345’, sex bit, primary key (id)) engine=InnoDB
如何给String字段指定默认值呢

所以如果指定columnDefinition这个属性会覆盖原来的列注解的长度,而且在其注解的中必须制定列的类型

* (Optional) The SQL fragment that is used when * generating the DDL for the column. * <p> Defaults to the generated SQL to create a * column of the inferred type. String columnDefinition() default "";

/**
*(可选)在以下情况下使用的SQL片段:
*正在为列生成DDL。
*默认使用生成的SQL来创建推断类型的列。
*/

@Column(name = “name”,columnDefinition=" varchar(11) default ‘12345’",length = 25)
private String name;
create table user (id bigint not null, age integer, birth datetime(6), name varchar(11) default ‘12345’, sex bit, primary key (id)) engine=InnoDB

columnDefinition 会将其中的值作为列名之后,如果在这里设置默认值,必须保证直接加在列名之后执行不会出错。

定义 Integer 和 Long 有区别吗

在这里插入图片描述
在这里插入图片描述
Long的默认长度为20,Integer的默认长度为11

定义Integer和int有区别吗

在这里插入图片描述
区别是int如果你不给他设置就会默认为0

boolean和Boolean也是一样的。

boolean类型

默认长度为1

@Column(name = “sex”)
private Boolean sex;

@Column(name = “sex”)
private boolean sex;

在这里插入图片描述
二者没有什么区别,如果我们将boolean设置默认值并且设置长度会咋样呢?

@Column(name = “sex”,length = 50)
private boolean sex;

生成的DDL语句中并没有长度的属性。所以在boolean类型中设置长度属性是没有作用的

create table user (id bigint not null, age integer, birth datetime(6), name varchar(255), sex bit, primary key (id)) engine=InnoDB

指定boolean类型的默认值呢

@Column(name = “sex”,columnDefinition = “bit(1) default 1”)
private boolean sex;
在这里插入图片描述

有注意,如果指定默认值为1,即是true,属性如果不指定,boolean的默认值就是false,所以会将false设置到对应的数据中,如果指定Boolean呢

如果指定Boolean的话,没有设置默认就是null,就会将空更新到数据库中,最好用的方法还是在java类中设置默认值。

默认的日期格式不具有可读性

@Column(name = "birth")
private Date birth;

在这里插入图片描述
使用@Temporal来制定格式

	@Temporal(TemporalType.DATE)
	@Column(name = "birth")
	private Date birth;

在这里插入图片描述
@Temporal有三个值

  • DATE 只有日期
  • TIME 只有时间 时分秒
  • TIMESTAMP 日期和时间都有

浮点数格式的设置

@Column(name = “age”,scale = 2)
private int age;

age integer,属性为scale = 2没有作用

@Column(name = “age”,scale = 2)
private float age;

在这里插入图片描述
@Column(name = “age”,precision = 5,scale = 2)
private float age;

还是没有用,指定数据格式为double,依然没有用

@Column(name = “age”,columnDefinition = “decimal(5,2)”)
private double age;

@Basic(fetch = FetchType.LAZY) @Type(type = "text") @Column(name = "remark") private String remark;
  • @Lob 指定该文本为长文本
  • @Basic(fetch = FetchType.LAZY) 长文本缓加载,便于数据的读取。
使用jpa去生成对应的值的长度和默认值是如何设置的呢@Target({ElementType.METHOD, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface Column { String name() default ""; boolean unique() default false; boolean nullable() default true; boolean @Query(value = select username from user,nativeQuery = true) // 注意返回值用String类型接收,也可以使用Object String findOneUserName(); 二、单表查询的一个字段、多条数据 @Query(value = select distinct username from user,nativeQuery = true) // 注意返回值用String类型接收,也可以使用Object List findAllUserName(); 三、多表查询的多个字段、一条数 (1)在类外面添加两个注解: @DynamicInsert @DynamicUpdate (2)在字段属性上方添加注解:@Column(name="state",columnDefinition="tinyint default 0") 源码如下: @DynamicInsert @DynamicUpdate public c...
对于第一个问题,猜想的主要原因是定义新的字段时,jpa框架会将默认定义值带上加到表中。如果后面加上默认定义值的定义时,jpa框架并不会智能地更新colum的定义。总结下就是创建新字段默认值才会生效。 对于第二个问题,通过jpa日志可以看出,插入的时候默认值是空值覆盖了我们数据库默认的值,导致看到默认值为null,程序NPE异常。 在插入新值的时候,手动设置默认值。 配置插入值时不能修改该字段; 直接属性字段设置默认值;............
使用SpringDataJpa设置字段默认值约束的2种方式 1、修改建表时的列定义属性 @Column(columnDefinition="INT DEFAULT '1' COMMENT '状态,1:正常,0:冻结状态,2:删除'") private Integer status; 2、通过Hibernate(org.hibernate.annotations.ColumnDefault)下提供的注解进行设置默认值 @ColumnDefault("1") private Integer status;
使用jpa也有很长一段时间了,其中的奥妙也只是用到了一点点,项目中不用到的知识也很少去想,真心是现用现学,这次遇到的问题是大文本,在数据库中的类型为TEXT,但是映射的时候该怎么做呢?!下面就来介绍一下吧: 实话实说,在使用jpa的时候,大部分的属性数据类型都是string,我们也知道string映射到数据库最大长度为255,在mysql数据库中映射为varchar(255)
如果我想用jpa创建一个这样的字段属性 @Column(name="nameid",columnDefinition="char(22)") private String nameId; 下面是我的项目真实案例 import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.data.annotation.Creat
可以使用`@PrePersist`和`@PreUpdate`注解来在持久化操作之前自动设置时间戳字段。具体做法如下: 1. 在实体类中添加时间戳字段,可以使用`java.util.Date`或者`java.time.LocalDateTime`类型。 ```java @Entity public class MyEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "created_at") private LocalDateTime createdAt; @Column(name = "updated_at") private LocalDateTime updatedAt; // getters and setters 2. 在实体类上添加`@EntityListeners`注解,并指定监听器类。 ```java @Entity @EntityListeners(MyEntityListener.class) public class MyEntity { // ... 3. 编写监听器类,在该类中使用`@PrePersist`和`@PreUpdate`注解来设置时间戳字段的值。 ```java public class MyEntityListener { @PrePersist public void prePersist(MyEntity entity) { LocalDateTime now = LocalDateTime.now(); entity.setCreatedAt(now); entity.setUpdatedAt(now); @PreUpdate public void preUpdate(MyEntity entity) { entity.setUpdatedAt(LocalDateTime.now()); 现在每次调用`entityManager.persist()`或`entityManager.merge()`方法时,都会自动设置时间戳字段的值。注意,如果使用了`@CreatedDate`和`@LastModifiedDate`注解,Spring Data JPA也会自动处理时间戳字段的赋值。