gpt4 book ai didi

java - jpa AttributeConverter 是否适用于查询子句?

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

我有一个像这样的 jpa 实体:

@Entity
public class RectangleEntity
{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@Column
private Integer x;

@Column
private Integer y;

@Column
@Convert(converter = ColorConverter.class)
private Color color;

}

而我的 ColorConverter 是这样的:

@Converter
public class ColorConverter implements AttributeConverter<Color, String[]> {

@Override
public String[] convertToDatabaseColumn(Color color) {
switch(color) {
case REDISH : return {"red","pink"};
case GREENISH: return {"green","cyan"};
}
return sb.toString();
}

@Override
public Color convertToEntityAttribute(String... colorStrings) {

if(colorStrings == null || colorStrings.length != 1) {
return null;
}
if(colorStrings[0].equals("red") || colorStrings[0].equals("pink")) {
return REDISH;
} else if(colorStrings[0].equals("green") || colorStrings[0].equals("cyan")) {
return GREENISH;
}
}

}

问题是我想在这样的查询中使用我的列值:

Expression<String> colorPath = root.get("color");
Predicate predicate = requestStatePath.in(Color.REDISH);
Predicate[] predicatesArr = predicates.toArray(new Predicate[predicates.size()]);
criteriaQuery.where(predicatesArr);
CriteriaQuery<RectangleEntity> criteriaQuery = criteriaBuilder.createQuery(RectangleEntity.class);
TypedQuery<RectangleEntity> query = this.em.createQuery(criteriaQuery);
query.getResultList();

我希望此查询选择我的所有记录,它们的颜色字段为粉红色或红色,因为它们是 REDISH

这可能吗?

最佳答案

我不认为你的转换器正在做你想要它做的事情。首先,意识到根据 JPA,它甚至不是有效的 AttributeConverter。 JPA 仅定义对基本类型的 AttributeConverter 的支持,不考虑 String[]一个基本类型。虽然 Hibernate 允许 String[] ,它只会将其视为可序列化的。

Are you expecting to store to store these String[]进入 DB ARRAY?如果是这样,Hibernate 不支持 DB ARRAY 类型(但是,我们一直在讨论在 6.0 中添加对它们的支持)。

但要回答您的确切问题...是的,JPA 说 AttributeConverter 应该按照第 3.8 节中概述的某些准则自动应用于查询:

... The persistence provider must apply any conversion methods to instances of attribute values in path expressions used within Java Persistence query language queries or criteria queries (such as in comparisons, bulk updates, etc.) before sending them to the database for the query execution. When such converted attributes are used in comparison operations with literals or parameters, the value of the literal or parameter to which they are compared must also be converted. ...

但是你最终会得到像 <BINARY> in <BINARY> 这样的谓词

关于java - jpa AttributeConverter 是否适用于查询子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39234463/

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