DEMO實(shí)現(xiàn)枚舉值的增查
1. entity
其中status
字段為枚舉類型椿争,存入數(shù)據(jù)庫的是對(duì)應(yīng)的枚舉值的值
StudentStatusEnum status
缺點(diǎn)是枚舉值可以為String和int類型,但是int類型會(huì)按照0開始最域,如果包含了枚舉值為-1逗扒,或者亂序的情況無法處理蜈出,參考解決JPA的枚舉局限性
@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "student", indexes =
{
@Index(name = "idx_stu_no", columnList = "stu_no")
}
)
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", length = 20)
@Comment("Primary Key, auto increment")
private Long id;
@Column(name = "stu_no", nullable = false, length = 20)
@Comment("student number")
private Long stuNo;
@Column(name = "stu_name", nullable = false, length = 50)
@Comment("student name")
private String stuName;
@Column(name = "age", nullable = false)
@Comment("age")
private Integer age;
@Column(name = "last_execute_timestamp", nullable = false)
@Comment("register date")
private LocalDateTime registerDate;
@Column(name = "status", nullable = false)
@Comment("0: inactive, 1: active")
private StudentStatusEnum status;
}
public enum StudentStatusEnum {
INACTIVE(0),
UNACTIVE(1);
private final int code;
StudentStatusEnum(final int code) {
this.code = code;
}
public int getCode() {
return this.code;
}
}
repository
注意stu.status = com.user.common.enums.StudentStatusEnum.INACTIVE
寫法秩伞,之所以能這么寫因?yàn)镋ntity中status
字段為枚舉類型吁伺。
@Repository
public interface StudentRepo extends JpaRepository<Student, Long>, PagingAndSortingRepository<Student, Long>, JpaSpecificationExecutor<Student> {
@Query(value =
"SELECT stu " +
"FROM Student stu " +
"WHERE stu.status = com.user.common.enums.StudentStatusEnum.INACTIVE " +
" or (stu.status = com.user.common.enums.StudentStatusEnum.UNACTIVE)"
)
List<Student> getStudent1();
}
Test
// @Ignore
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class StudentRepoTest extends Specification {
@Autowired
StudentRepo studentRepo
@Commit
def "save student"() {
given:
Student student = new Student()
student.stuNo = 111L
student.stuName = "neo"
student.age = 18
student.registerDate = LocalDateTime.now()
student.status = StudentStatusEnum.INACTIVE
when:
def res = studentRepo.save(student)
then:
res.stuNo == 111L
}
def "get student"() {
given:
void
when:
def student = studentRepo.getStudent1();
then:
student.size() == 1
}
}
application.yml
spring:
jpa: #Jpa configuration. update or automatic table generation, console print sql
database: mysql
show-sql: true
properties:
hibernate:
format_sql: true
# generate_statistics: true
hibernate:
ddl-auto: update
naming:
implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
數(shù)據(jù)庫表
因?yàn)閖pa配置了ddl-auto: update
饮睬,所以執(zhí)行單測(cè)時(shí)會(huì)自動(dòng)創(chuàng)建表
CREATE TABLE `student` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'Primary Key, auto increment',
`age` int NOT NULL COMMENT 'age',
`last_execute_timestamp` datetime(6) NOT NULL COMMENT 'register date',
`status` int NOT NULL COMMENT '0: inactive, 1: active',
`stu_no` bigint NOT NULL COMMENT 'student number',
`stu_name` varchar(50) NOT NULL COMMENT 'student name',
PRIMARY KEY (`id`),
KEY `idx_stu_no` (`stu_no`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
參考
【1】JPA遇到枚舉類型:http://www.reibang.com/p/9a4f0373bd19
【2】解決JPA的枚舉局限性:https://www.cnblogs.com/xiaoq/p/7885775.html