【问题标题】:JPA Specification, using like againt List<String>JPA 规范,使用 likeagaint List<String>
【发布时间】:2022-01-28 11:59:56
【问题描述】:

我在使用 List 字段时遇到问题。

实体类:

@Entity
public class ToSearch{

    @Convert(converter = CollectionConverter.class)
    private List<String> myList;

    //... OTHER FIELDS ...

}

转换器类:

public class CollectionConverter implements AttributeConverter<List<Object>, String> {

    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public String convertToDatabaseColumn(List<Object> object) {
        try {
            return objectMapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            return "";
        }
    }

    @Override
    public List<Object> convertToEntityAttribute(String data) {
        try {
            return objectMapper.readValue(data, new TypeReference<List<Object>>() {
            });
        } catch (Exception e) {
            return null;
        }
    }
}

还有一个简单的规范:

predicates.add(criteriaBuilder.like(criteriaBuilder.lower(root.get("myList")), "%"+ term + "%")));

我的目标很简单,只要搜索一个词串,把它当作一个简单的字符串。

实际上,在数据库中,myList 是一个字符串,点赞搜索效果很好。

但是...当我执行这个...

Parameter value [%BLA%] did not match expected type [java.util.List (n/a)]

有什么想法吗?

【问题讨论】:

    标签: spring-boot spring-data-jpa


    【解决方案1】:

    最后,正如错误所说,我需要将要搜索的字段更改为兼容类型的数据。

    criteriaBuilder.like(criteriaBuilder.lower(root.get("myList").as(String.class)), "%" + term + "%")));
    

    这样做,JPA 将 myList 视为字符串,不再有不兼容的类型。

    【讨论】:

      猜你喜欢
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 2018-07-16
      • 2021-06-08
      相关资源
      最近更新 更多