spring-data-jpa 带有转换器的JPA查询属性

s3fp2yjn  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(164)

我有一个JPA 2.2应用程序,其中包含JPA 2.2。我有一个如下所示的实体:

@Data
@Entity
@Table(name = "entity")
public class Entity implements Serializable {

  ....

  @Convert(converter = ListConverter.class)
  private List<String> referenceCode;
  ....

}

我有这个Converter

@Converter(autoApply = true)
public class ListConverter implements AttributeConverter<List<String>, String> {

  @Override
  public String convertToDatabaseColumn(List<String> attribute) {
    return String.join(";", attribute);
  }

  @Override
  public List<String> convertToEntityAttribute(String dbData) {
    return new ArrayList<>(Arrays.asList(dbData.split(";")));
  }
}

当我插入或提取这个元素时,一切都很正常。但是现在我想查询那个元素,但我不知道怎么做。如果我这样做:

public List<Entity> findByReferenceCode(String reference);

如果我这样做,它就不起作用:

@Query("select e from Entity e where e.referenceCode IN ?1")
public List<Entity> findByReferenceCode(List<String> reference);

还是不行..
我找到的唯一方法是通过nativeQuery,但实际上是一个极值比。我怎么能解决这个问题呢?谢谢

n9vozmp4

n9vozmp41#

要在这里真正做到您想要的,您需要使用@ElementCollection。(这就是@ElementCollection的作用)。您可以继续使用@转换器,但是您的查询必须被定制以处理实体属性类型(列表)和实际数据库列类型(字符串)之间的差异。
如果您对@Converter的限制没有意见,那就没问题(我就是这样使用它们的),但是如果您确实需要像查询集合一样查询属性(例如,搜索多个独立项、执行计数、聚合等),并且您希望这些查询由JPA层生成,那么您将不得不使用@ElementCollection并让它创建第二个表。

相关问题