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

时间:2016-08-30 18:16:08

标签: java hibernate jpa jpa-2.1

我有一个像这样的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 个答案:

答案 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>

这样的谓词