【问题标题】:How to handle properties of type URI with spring data jpa?如何使用 spring data jpa 处理 URI 类型的属性?
【发布时间】:2015-11-18 13:53:10
【问题描述】:

假设有一个实体

@Entity
public class Article {
 // ...
  private String uri;

  public void setUri(URI uri) {
    this.uri = uri.toString();
  }

  public URI getUri() {
    return URI.create(uri.toString();
  }
}

还有一个 spring data jpa 存储库

public interface ArticleRepository extends CrudRepository<Article, Long> {
    Optional<Article> findByLink(URI link);
}

但使用findByLink(URI) 方法失败并出现InvalidDataAccessApiUsageException: Parameter value [http://foo.de/foo.html] did not match expected type [java.lang.String (n/a)]。这当然可以通过将参数类型更改为字符串来避免。但随后每个URI 都必须在查询之前转换为字符串。

如果必须使用 spring data jpa 查询 URI 类型的属性,最好的方法是什么?

【问题讨论】:

标签: java spring spring-data-jpa


【解决方案1】:

在您当前的配置中,您尝试将 URI 参数应用于字符串字段。失败的原因很明显

选项 1

您更改字段以获取 URI 并注册转换器以将 URI 转换为 DB 表示。

看起来像这样:

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

    @Override
    public String convertToDatabaseColumn(URI entityValue) {
        return (entityValue == null) ? null : entityValue.toString();
    }

    @Override
    public URI convertToEntityAttribute(String databaseValue) {
        return (StringUtils.hasLength(databaseValue) ? URI.create(databaseValue.trim()) : null);
    }
}

使用此转换器,您也可以将字段更改为 URI:

@Entity
public class Article {
 // ...
  private URI uri;

  public void setUri(URI uri) {
    this.uri = uri;
  }

  public URI getUri() {
    return this.uri;
  }
}

选项 2

我尝试了选项 1 并且可以确认它正在工作 - 但选项 2 是理论上的 - 我认为您正在使用 JPA 字段访问 - 所以 JPA 使用这些字段访问您的实体 - 我想如果您将访问更改为 PROPERTY JPA应该使用您的 getter 和 setter - 它们具有正确的类型,因此您的代码可以工作。

使用映射注释的位置推断访问类型。如果您对字段进行注释,您将获得字段访问权限 - 如果您对 getter 进行注释,您将获得属性访问权限。还有实体级别注解设置访问级别javax.persistence.Access

@Access(PROPERTY)

尝试使用上面的注释来注释您的实体并尝试一下。

猜你喜欢
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 2013-11-04
  • 2017-05-06
  • 1970-01-01
  • 2020-07-15
  • 2018-02-07
  • 2019-09-14
相关资源
最近更新 更多