有没有办法在 Criteria API 调用期间(本地)绕过或禁用 AttributeConverter?
Is there a way to (locally) bypass or disable an AttributeConverter during a Criteria API call?
假设一个 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 的条件 API(新的或旧的 API)来搜索信用卡以“123”开头的数字:
CreditcardNumb cn = new CreditcardNumb("123");
createCriteria(Wallet.class)
.add(Restrictions.ilike("creditcard", cn, MatchMode.START))
.list();
但是,由于“123”不是有效的信用卡号,因此对象实例化失败。此外,这甚至无法编译,因为 ilike
方法只接受 String
,而不接受 CreditcardNumb
。
我的问题:
是否有 任何 方法(本地)绕过或禁用转换,以便我可以做类似的事情:
createCriteria(Wallet.class)
.disable(CreditcardnumbConverter.class))
.add(Restrictions.ilike("creditcard", "123", MatchMode.START))
.list();
或者是否有任何其他方法可以使用标准 API(不使用 HQL)搜索以“123”开头的信用卡号。
您可以在 String
类型的另一个 属性 中映射信用卡列:
@Entity
public class Wallet {
private CreditcardNumb creditcard;
@Column(name = ..., insertable = false, updatable = false)
private String creditcardStr;
...
}
关键是要把这个列映射为既不可插入也不可更新,这样它的值就不会被持久化(否则Hibernate不知道是用creditcard
还是creditcardStr
值来更新基础数据库列)。
现在您的查询可以如下所示:
createCriteria(Wallet.class)
.add(Restrictions.ilike("creditcardStr", "123", MatchMode.START))
.list();
假设一个 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 的条件 API(新的或旧的 API)来搜索信用卡以“123”开头的数字:
CreditcardNumb cn = new CreditcardNumb("123");
createCriteria(Wallet.class)
.add(Restrictions.ilike("creditcard", cn, MatchMode.START))
.list();
但是,由于“123”不是有效的信用卡号,因此对象实例化失败。此外,这甚至无法编译,因为 ilike
方法只接受 String
,而不接受 CreditcardNumb
。
我的问题:
是否有 任何 方法(本地)绕过或禁用转换,以便我可以做类似的事情:
createCriteria(Wallet.class)
.disable(CreditcardnumbConverter.class))
.add(Restrictions.ilike("creditcard", "123", MatchMode.START))
.list();
或者是否有任何其他方法可以使用标准 API(不使用 HQL)搜索以“123”开头的信用卡号。
您可以在 String
类型的另一个 属性 中映射信用卡列:
@Entity
public class Wallet {
private CreditcardNumb creditcard;
@Column(name = ..., insertable = false, updatable = false)
private String creditcardStr;
...
}
关键是要把这个列映射为既不可插入也不可更新,这样它的值就不会被持久化(否则Hibernate不知道是用creditcard
还是creditcardStr
值来更新基础数据库列)。
现在您的查询可以如下所示:
createCriteria(Wallet.class)
.add(Restrictions.ilike("creditcardStr", "123", MatchMode.START))
.list();