美文网首页
JPA遇到枚举类型

JPA遇到枚举类型

作者: 猫尾草 | 来源:发表于2019-12-22 15:43 被阅读0次

1. 枚举类存入MySQL使用的数据库字段类型

  因为一些问题(这里不谈),java的entity中如果有使用枚举类,在存入MySQL时,MySQL对应的数据类型使用String或者int,而不是enum
  这时最简单的方法就是在java的entity中对应的字段加上@Enumerated注解,例如:

@Enumerated(EnumType.STRING)
private DataStatusEnum templateState;

  上面的EnumType.STRING表示存到MySQL中的是String类型,即templateState.name();如果要存数字,则使用EnumType.ORDINAL,存入的就是templateState.ordinal(),表示的是枚举类型在枚举类中的先后顺序,从0开始。
  如果这两种都不满足要求,复杂一点的也可以自定义Converter(这里不谈,想了解可以参考https://www.cnblogs.com/xiaoq/p/7885775.html)。

2. JPA查询使用枚举类作为参数的方法

  我们知道JPA的一大特点就是不用写SQL语句,JPA会帮你将java查询代码转换为SQL去查询数据库(其中最重要的entity的属性与表字段的映射关系,对于枚举类来说就是1中提到的)。
  JPA查询方法有四种:

2.1 继承JpaRepository接口,查询方法名中拼接查询条件

List<WatermarkTemplate> findByOwnerAndWatermarkTemplateState(String owner, DataStatusEnum watermarkTemplateState);

  findByOwnerAndWatermarkTemplateStateOwnerWatermarkTemplateState就是属性名并改为首字母大写。

2.2 继承JpaRepository接口,使用@Query注解编写hql语句

@Query("from WatermarkTemplate where owner=?1 and watermarkTemplateState=?2")
List<WatermarkTemplate> findByOwnerAndWatermarkTemplateState(String owner, DataStatusEnum watermarkTemplateState);

  其中ownerwatermarkTemplateState是实体类WatermarkTemplate的两个属性,而不是MySQL表中字段名称,JPA会帮你做映射。
  如果属性名是watermarkTemplateState,字段名是watermark_template_state,这样驼峰和下划线对应,JPA会自动做映射;如果不对应,就要在属性上加注解@Column("watermark_template_state"),括号中是表的字段名,这样来告诉JPA映射关系。

2.3 继承JpaRepository接口,使用@Query注解编写SQL语句

@Query(nativeQuery = true, value="select * from watermark_template where owner=:owner and watermark_template_state=:watermarkTemplateState")
List<WatermarkTemplate> findByOwnerAndWatermarkTemplateState(String owner, String watermarkTemplateState);

  这里nativeQuery = true就是表示使用原生SQL语句,SQL语句就不解释了,区别就在于使用的是MySQL表名watermark_template和字段名ownerwatermark_template_state(注意和2中对比)。

2.4 继承JpaSpecification接口,使用Java代码编写查询条件

public Specification<WatermarkTemplate> getWatermarkTemplateSpec(final String owner, final DataStatusEnum templateState) {
    return (root, query, cb) -> {
        Predicate res = cb.equal(root.get("owner"), owner);
        res = cb.and(res, cb.equal(root.get("watermarkTemplateState"), templateState));
        return res;
    };
}
List<WatermarkTemplate> res = watermarkTemplateDao.findAll(getWatermarkTemplateSpec);

  其中watermarkTemplateDao继承JpaSpecification接口。

2.5 这四种方法在枚举类使用上的区别

  这其中1、2、4都跟MySQL的表名、字段名没有什么关系,是JPA映射实体类和数据库表;查询参数中枚举类和String或者int的转换也是JPA自动完成的(但是要记得加@Enumerated注解,否则不起作用)。
  只有3,因为是写原生SQl,不仅是自己写表名和字段名,参数也不能直接传入枚举类型,如果使用@Enumerated(EnumType.STRING)就要手动转换传入templateState.name(),如果使用@EnumType.ORDINAL就要手动转换传入templateState.ordinal()。

相关文章

  • JPA关于枚举类型的处理

    当我们使用jpa处理枚举类型的自定义查询时,可以这么干: 将枚举的字符串形式存储到数据库中 首先在model中指定...

  • C语言基础 之 枚举类型

    枚举类型 枚举类型: 列出所有可能的值 枚举类型的定义 枚举类型定义的一般格式:enum 枚举类型名 {枚举值表}...

  • Swift 基础笔记 - 枚举

    枚举 OC定义和使用枚举 Swift定义枚举类型 Swift判断枚举类型 枚举成员类型

  • 枚举

    枚举 枚举就是专门用来表示几种固定类型的取值 枚举的本质就是基本数据类型,整型 枚举类型定义格式 定义枚举类型变量...

  • JavaScript中的Enum枚举类型数据

    一、枚举类型介绍 1、枚举类型 如果接触过其它语言或者TypeScript,大概对于枚举类型有一些了解。枚举类型是...

  • TS学习笔记(6)-枚举类型

    枚举类型 ========= 知识点 枚举类型的定义方法 枚举类型的使用方法 代码

  • 一个枚举空指针

    1.遇到的问题 枚举类型作为Map类型的key时,使用.name方法的地方注意

  • WWDC2015Session106What's New

    新特性:基本类型、类型匹配、可检查性、协议扩展、错误处理 基本类型 枚举 在枚举中加入类型: 递归枚举递归枚举中需...

  • 枚举类

    1.枚举类型的定义: 枚举类型定义的一般形式为 enum 枚举名{//枚举值表枚举值1;枚举值2;...} 在枚举...

  • C语言学习 - 枚举型数据类型

    枚举变量的定义 方式一Step 1:声明枚举类型:格式:enum 枚举类型名{枚举值1,...,枚举值n}如:en...

网友评论

      本文标题:JPA遇到枚举类型

      本文链接:https://www.haomeiwen.com/subject/benznctx.html