gpt4 book ai didi

java - 有没有办法在 Criteria API 调用期间(本地)绕过或禁用 AttributeConverter?

转载 作者:搜寻专家 更新时间:2023-11-01 03:17:54 25 4
gpt4 key购买 nike

假设一个 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 方法只接受 String,而不接受 CreditcardNumb

我的问题:

是否有任何方法(本地)绕过或禁用转换,以便我可以执行类似的操作:

createCriteria(Wallet.class)
.disable(CreditcardnumbConverter.class))
.add(Restrictions.ilike("creditcard", "123", MatchMode.START))
.list();

或者有没有其他方法可以使用 Criteria 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();

关于java - 有没有办法在 Criteria API 调用期间(本地)绕过或禁用 AttributeConverter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41819223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com