jpa AttributeConverter 是不是适用于查询子句?
Posted
技术标签:
【中文标题】jpa AttributeConverter 是不是适用于查询子句?【英文标题】:Does jpa AttributeConverter apply in query clause?jpa AttributeConverter 是否适用于查询子句? 【发布时间】:2016-08-30 18:16:07 【问题描述】:我有一个这样的 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
。
有可能吗?
【问题讨论】:
【参考方案1】:我不认为您的转换器正在做您希望它做的事情。首先,要意识到根据 JPA,它甚至不是一个有效的 AttributeConverter。 JPA 仅在基本类型上定义了对 AttributeConverters 的支持,并且不将 String[]
视为基本类型。虽然 Hibernate 允许 String[]
,但它只会将其视为可序列化。
您是否希望将这些String[]
s 存储到数据库阵列中?如果是这样,Hibernate 不支持 DB ARRAY 类型(然而,我们一直在讨论在 6.0 中添加对它们的支持)。
但是要回答您的确切问题...是的,JPA 说 AttributeConverter 应该按照第 3.8 节中概述的某些准则自动应用于查询:
... 持久性提供程序必须将任何转换方法应用于 Java Persistence 查询语言查询中使用的路径表达式中的属性值实例或 条件查询(例如比较、批量更新等),然后将它们发送到数据库以供 查询执行。当此类转换后的属性用于与文字的比较操作或 参数,也必须转换与它们进行比较的文字或参数的值。 ...
但你最终会得到像 <BINARY> in <BINARY>
这样的谓词
【讨论】:
感谢您的回复。您对 String[] 的看法是正确的。那是我的错误。由于我使用了 oracle 视图,我的问题不在于存储价值。我想用一个类型的参数查询我的视图,该参数将转换为一组值,这些值将用作in
值。我没有收到你的最后陈述。以上是关于jpa AttributeConverter 是不是适用于查询子句?的主要内容,如果未能解决你的问题,请参考以下文章
Spring JPA Hibernate 和 AttributeConverter
LocalDateTime 的 JPA AttributeConverter
spring jpa之实体属性类型转换器AttributeConverter,自定义Converter,通用Converter
JPA AttributeConverter和Hibernate的ColumnTransformer在属性的加密和解密方面的区别