通过使用 Jooq 和 JPA 的 @Column 注释来验证字段长度

Posted

技术标签:

【中文标题】通过使用 Jooq 和 JPA 的 @Column 注释来验证字段长度【英文标题】:Validating field length by making use of Jooq and JPA's @Column annotation 【发布时间】:2017-10-03 18:06:21 【问题描述】:

我正在尝试通过使用 JSR 303 验证来验证用户输入的数据。我正在尝试实施的一项验证是检查每个字段的输入值的大小是否不超过相应列的最大大小。

为了将字段映射到数据库列,我正在使用 JPA 的 @Column 注释,如下所示:

@ComplexValidation
public class Person 

    @Column(table = "PERSON_DETAILS", name = "FIRST_NAME")
    private String firstName;


Person 类上的@ComplexValidation 注释是我正在尝试实现的 JSR 303 自定义约束验证器,它基本上尝试执行以下步骤:

    检索使用@Column注解的类中的所有字段 它从注解中提取表名,并用它来加载对应的JOOQ生成的代表表的类 从注解中提取字段名,并用它来加载对应列的数据类型和大小

在 Jooq 中有什么方法可以根据表名检索 Jooq Generated 类?我的第一次尝试可以在下面找到,但是它不起作用,因为 table(tableName) 返回一个 SQLTable 而不是 TableImpl 对象:

Column columnAnnotation = field.getDeclaredAnnotation(Column.class);
if (columnAnnotation != null) 
    String tableName = columnAnnotation.table();
    String fieldName = columnAnnotation.name();

    TableField tableField = (TableField) ((TableImpl) table(tableName)).field(fieldName);
    int columnLength = tableField.getDataType().length();

    if (fieldValue.length() > columnLength) 
        constraintValidatorContext
            .buildConstraintViolationWithTemplate("exceeded maximum length")
            .addPropertyNode(field.getName())
            .addConstraintViolation();
    

欢迎任何其他建议:)

【问题讨论】:

【参考方案1】:

假设您只有一个生成的架构(例如PUBLIC),您可以从那里访问表:

Table<?> table = PUBLIC.getTable(tableName);

Schema.getTable(String)

【讨论】:

以上是关于通过使用 Jooq 和 JPA 的 @Column 注释来验证字段长度的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot with JOOQ 和 Spring Data JPA 之间的技术差异

jOOQ 无法映射 PostgreSQL 列以使 JPA 满意

JOOQ 使用索引创建表

在 Hibernate 事务中执行 jOOQ 语句

JPA / Hibernate可以与其他持久性框架(如jOOQ)结合使用

JOOQ 强制类型无法通过 JPADatabase 代码生成生成 NUMERIC SQL 数据类型