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 查询语言查询中使用的路径表达式中的属性值实例或 条件查询(例如比较、批量更新等),然后将它们发送到数据库以供 查询执行。当此类转换后的属性用于与文字的比较操作或 参数,也必须转换与它们进行比较的文字或参数的值。 ...

但你最终会得到像 &lt;BINARY&gt; in &lt;BINARY&gt; 这样的谓词

【讨论】:

感谢您的回复。您对 String[] 的看法是正确的。那是我的错误。由于我使用了 oracle 视图,我的问题不在于存储价值。我想用一个类型的参数查询我的视图,该参数将转换为一组值,这些值将用作in 值。我没有收到你的最后陈述。

以上是关于jpa AttributeConverter 是不是适用于查询子句?的主要内容,如果未能解决你的问题,请参考以下文章

Spring JPA Hibernate 和 AttributeConverter

LocalDateTime 的 JPA AttributeConverter

spring jpa之实体属性类型转换器AttributeConverter,自定义Converter,通用Converter

JPA AttributeConverter和Hibernate的ColumnTransformer在属性的加密和解密方面的区别

SpringBoot JPA 2.1 Converter 忽略 convertToDatabaseColumn

使用 AttributeConverter 的 Spring Boot 测试不适用于 Maven 测试