我有一个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,但实际上是一个极值比。我怎么能解决这个问题呢?谢谢
1条答案
按热度按时间n9vozmp41#
要在这里真正做到您想要的,您需要使用
@ElementCollection
。(这就是@ElementCollection
的作用)。您可以继续使用@转换器,但是您的查询必须被定制以处理实体属性类型(列表)和实际数据库列类型(字符串)之间的差异。如果您对
@Converter
的限制没有意见,那就没问题(我就是这样使用它们的),但是如果您确实需要像查询集合一样查询属性(例如,搜索多个独立项、执行计数、聚合等),并且您希望这些查询由JPA层生成,那么您将不得不使用@ElementCollection
并让它创建第二个表。