我有一个像这样的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
。
有可能吗?
答案 0 :(得分:1)
我不认为您的转换器正在按照您的意愿行事。首先,根据JPA,实现甚至不是有效的AttributeConverter。 JPA仅定义对基本类型的AttributeConverters的支持,并不认为String[]
是基本类型。虽然Hibernate允许String[]
,但它只会将其视为Serializable。
您是否希望将这些String[]
存储到DB ARRAY中?如果是这样,Hibernate不支持DB ARRAY类型(但是,我们一直在讨论在6.0中添加对它们的支持)。
但要回答你的确切问题......是的,JPA表示AttributeConverter应该在第3.8节所述的某些指导原则中自动应用于查询中:
...持久性提供程序必须应用任何转换方法 Java持久性查询语言查询中使用的路径表达式中的属性值实例 标准查询(例如在比较,批量更新等)之前将它们发送到数据库中 查询执行。当这些转换的属性用于与文字或文字的比较操作时 参数,还必须转换它们所比较的文字或参数的值。 ...
但是你最终会得到像<BINARY> in <BINARY>