【问题标题】: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。

有可能吗?

【问题讨论】:

    标签: java hibernate jpa jpa-2.1


    【解决方案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 值。我没有收到你的最后陈述。
    猜你喜欢
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2015-06-18
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多