【发布时间】:2017-06-08 17:20:45
【问题描述】:
假设CreditcardNumb.class 带有一个检查信用卡号是否有效的构造函数。
然后我创建一个CreditcardNumbConverter.class 将信用卡号转换为数据库中的字符串:
public class CreditcardnumbConverter
implements AttributeConverter<CreditcardNumb, String> {
public String convertToDatabaseColumn(CreditcardNumb cn) {
if (cn== null) return null;
return cn.toString();
}
public CreditcardNumb convertToEntityAttribute(String cn) {
if ((cn == null) || cn.trim().isEmpty()) return null;
return new CreditcardNumb(cn);
}
}
这没问题,但现在我想使用 Hibernate 的 Criteria API(新的或旧的 API)来搜索以“123”开头的信用卡号:
CreditcardNumb cn = new CreditcardNumb("123");
createCriteria(Wallet.class)
.add(Restrictions.ilike("creditcard", cn, MatchMode.START))
.list();
但是,由于“123”不是有效的信用卡号,对象实例化失败。此外,这甚至不会编译,因为ilike 方法只接受Strings,而不接受CreditcardNumbs。
我的问题:
是否有任何方法(本地)绕过或禁用转换,以便我可以执行以下操作:
createCriteria(Wallet.class)
.disable(CreditcardnumbConverter.class))
.add(Restrictions.ilike("creditcard", "123", MatchMode.START))
.list();
或者有没有其他方法可以使用 Criteria API(不使用 HQL)搜索以“123”开头的信用卡号。
【问题讨论】:
-
没办法。重新考虑您的验证。我个人不喜欢在构造函数内部进行验证。编译器在做任何事情之前首先查看构造函数。这就是你出错的原因。
-
你不喜欢构造函数中的验证?抱歉,但我不喜欢我的物品处于非法状态。我只想拥有合法的信用卡号码,但能够使用 Criteria API 进行搜索。
标签: java hibernate hibernate-criteria jpa-2.1