【问题标题】:Java Jpa Custom entity attribute converter and SpecificationJava Jpa 自定义实体属性转换器和规范
【发布时间】:2021-05-06 15:00:45
【问题描述】:

在我的 Java 代码中,我有一个 JPA 实体定义如下

public class Entity {

    @Id
    private Long id;

    ... other attributes;

    @Column(name = "ctx")
    @Convert(converter = MapToJsonStringConverter.class)
    private Map<String, String> ctx;
}

@Convert
public class MapToJsonStringConverter implements AttributeConverter<Map<String, String>, String> {

    @Autowired
    private JsonParserService jsonParserService;

    @Override
    public String convertToDatabaseColumn(final Map<String, String> map) {
        return Optional.ofNullable(map)
                .map(jsonParserService::writeValueAsString)
                .orElse(null);
    }

    @Override
    public Map<String, String> convertToEntityAttribute(final String string) {
        return Optional.ofNullable(string)
                .map(jsonParserService::readValueAsMap)
                .orElse(null);
    }
}

Jpa 属性转换器用于将ctx 属性与 JSON 字符串转换。我需要创建一个 JPA 规范,允许我使用 LIKE 子句查询数据库中的 ctx 字段:

ctx LIKE '%test-value%'

当然,当我尝试创建这样的规范时,标准构建器无法匹配属性的类型,因为它需要一个映射,而我只提供一个字符串

cb.like(root.get(Entity_.ctx), string))  <--- compile error Cannot resolve method 'like(javax.persistence.criteria.Expression<M>, java.lang.String)'

有没有办法让这项工作而不是使用本机查询?考虑到最终规范还涉及同一实体的其他属性。

【问题讨论】:

  • ctxString。可以提供MapToJsonStringConverter吗?
  • 更新原帖
  • 请提供ctx的例子
  • 它是一个包含键值属性的 json 映射的字符串 -> { "key": "value", "anotherKey": "anotherValue"}
  • 你试过cb.like(root.get(Entity_.ctx).as(String.class), string) 吗?提到here

标签: java hibernate jpa


【解决方案1】:

如评论中所述

cb.like(root.<String>get("ctx"), clause);

不能像 root.get(Entity_.ctx) 那样工作,或者它的等价物确实返回 Map&lt;String, String&gt; 并且显式键入泛型 (&lt;String&gt;get(...)) 将无济于事,因为 Map 不是 instanceof Stringhere 提到的解决方案是使用 Criteria 提供的as

cb.like(root.get(Entity_.ctx).as(String.class), string)

感谢Map 覆盖Object.toString(),它确实有效。 否则,您需要创建自己的扩展 Map 的类并将覆盖自定义为 toString() 以返回您的自定义表示(默认情况下由 Json 库使用)。

【讨论】:

  • 在这个特定的答案上再做一个,这基本上可以正常工作,但同时它正在转换为 VARCHAR(255),这意味着该列在搜索期间被截断。有没有办法将其转换为 TEXT ?
猜你喜欢
  • 2023-01-31
  • 2017-04-13
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
相关资源
最近更新 更多