我正在考虑从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我该怎么做?
我建议您不要试图以“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试图让您省去这一繁琐),但实际上,在我看来,它可以很好地扩展到复杂的域对象,并且很容易理解应用程序中的数据流。
进行此类验证的“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不能为