当前位置: 首页 > 知识库问答 >
问题:

jOOQ:允许-字符约束?

郏博瀚
2023-03-14

我正在考虑从Hibernate转移到jOOQ,但我找不到例如如何在Hibernate中对这样的String进行Pattern约束:

@NotEmpty(message = "Firstname cannot be empty")
@Pattern(regexp = "^[a-zA-Z0-9_]*$", message = "First Name can only contain characters.")
private String firstname;

在jOOQ我该怎么做?

共有2个答案

华宏逸
2023-03-14

我建议您不要试图以“hibernate/JPA”的方式使用jOOQ。让jOOQ生成的类保持原样,并手动映射到您自己的域类,您可以随意对其进行注释。然后,您可以在尝试持久化JSR验证程序之前调用它们。

例如,jOOQ可能会生成以下类

public class BookRecord extends UpdatableRecordImpl<BookRecord> {

    private String firstname;

    public void setId(Integer value) { /* ... */ }

    public Integer getId() { /* ... */ }

}

您可以创建自己的域对象

public class Book {

    @NotEmpty(message = "Firstname cannot be empty")
    @Pattern(regexp = "^[a-zA-Z0-9_]*$", message = "First Name can only contain characters.")
    private String firstname;

    public void setId(Integer value) { /* ... */ }

    public Integer getId() { /* ... */ }

}

在DAO层中检索到BookRecord,然后手动映射

Book book = new Book();
book.setId(bookRecord.getId());
book.setFirstname(bookRecord.getFirstname());

这看起来相当乏味(ORM试图让您省去这一繁琐),但实际上,在我看来,它可以很好地扩展到复杂的域对象,并且很容易理解应用程序中的数据流。

轩辕乐邦
2023-03-14

进行此类验证的“jOOQ方法”是创建:

  • 数据库中的检查约束

毕竟,如果您希望确保数据完整性,那么数据库就是此类约束和完整性检查所属的位置(可能除了功能等效的客户端验证之外)。设想一个批处理作业、一个Perl脚本,甚至是一个绕过JSR-303验证的JDBC语句。您很快就会发现自己的数据已损坏。

如果您确实想要实现客户端验证,您仍然可以在DTO上使用JSR-303,例如,它可以与UI交互。但是,在将数据传递给jOOQ进行存储之前,您必须执行验证(正如artbristol所解释的)。

但是,您可以使用自己的自定义类型,方法是在单个列上声明Conver,并向源代码生成器注册这样的Conver

本质上,一个转换器是:

public interface Converter<T, U> extends Serializable {
    U from(T databaseObject);
    T to(U userObject);
    Class<T> fromType();
    Class<U> toType();
}

在您的情况下,您可以实现如下注释:

public class NotEmptyAlphaNumericValidator implements Converter<String, String> {

    // Validation
    public String to(String userObject) {
        assertNotEmpty(userObject);
        assertMatches(userObject, "^[a-zA-Z0-9_]*$");
        return userObject;
    }

    // Boilerplate
    public String from(String databaseObject) { return databaseObject; }
    public Class<String> fromType() { return String.class; }
    public Class<String> toType() { return String.class; }
}

请注意,这更像是一种变通方法,因为Conver不是为这个用例设计的,即使它可以完美地实现它。

还有一个挂起的功能请求#4543,用于添加对客户端验证的更多支持。截至jOOQ 3.7,这尚未实施。

 类似资料:
  • 我预计我的< code>UICollectionView会有问题,基本上当我清除约束时,它会完美地滚动,尽管我无法到达底部(但那是另一天的事情),但是宽度太大了,我只能看到我的< code>UICollectionView的左半部分。 现在,当我设置使其适合屏幕时,它将不再滚动。即使UIRefreshControl也不会触发。 我没有办法了,有人有线索吗?或者解决办法? 非常感谢! 编辑:它不会滚

  • 问题内容: 我正在使用Base64编码来编码Java中的用户ID字段。 我想知道上面的字符串abc是否包含字符“,:”吗? 当以abc返回Base64编码的字符串时,它是否会包含以下字符? 问题答案: 您不会在Base64编码的字符串中看到任何逗号,冒号或双引号。由于等号用于填充结尾内容,因此您会看到等号。

  • 我试图找到一种方法来确定一个字符串是否至少包含n个特定顺序的字符。 我正在处理大量的手写数据,错别字的数量相当疯狂。 我需要在一个大字符串中查找文本部分,如下所示: 看起来有点奇怪,但很管用。 不幸的是,怪异还不止于此。我需要修改这个regex,以便它也允许每个单词中缺少1个字母。 因此,我需要修改这个regex,以便它也适用于以下内容: 我一直在研究{4},但我不确定这是正确的方向,也不确定它是

  • 我一直在捕捉非数字时遇到问题。 我试过了,但抓不住。如果我让它捕获非数字,但不让用户再次尝试输入。。。它完全停止了我的代码。 这是我的密码:

  • 问题内容: 我在这里的研究中得到了不同的答案。 有人可以验证Redis服务器只能存储任何数值的表示吗? 例如,如果我在lpush中使用具有双重类型的Java客户端(Jedis),在发送给Redis之前是否需要将其转换为等效于字符串类型的内容? 还是有一种方法可以发送诸如double之类的实际数字类型?如果是这样,是否有任何示例代码说明了如何实现此目的? 谢谢 问题答案: Redis将所有内容存储在

  • 问题内容: 我是第一次使用oracle,我有一个名为ExpenseReport的表,该表存储有关费用的详细信息。 我希望Null允许ApprUserNo,如果ERStatus =’PENDING’,将不胜感激,我一直在努力整理整个上午 问题答案: 您需要重新形成约束。 首先,如果您希望一个字段保留空值,而不考虑其他任何规则,则该字段必须为可空字段。 其次,创建一个约束,说ApprUserNo不能为