java - 如何使用 spring data jpa 处理 URI 类型的属性?

标签 java spring spring-data-jpa

假设有一个实体

@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 数据 jpa 存储库

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

但使用 findByLink(URI) 方法失败并出现 InvalidDataAccessApiUsageException:参数值 [http://foo.de/foo.html] 与预期类型 [java.lang.字符串(不适用)]。这当然可以通过将参数类型更改为字符串来避免。但是每个 URI 都必须在查询之前转换为字符串。

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

最佳答案

在您当前的配置中,您正在尝试将 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)

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

关于java - 如何使用 spring data jpa 处理 URI 类型的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33781855/

相关文章:

java - Android 中如何去掉不需要的字符?

java - 我的表格 View 中的表格单元格为空。 JavaFX + 场景构建器

Spring Session with Redis - server.session.timeout 无效

java - Spring MVC REST - 根据请求内容类型返回 xml 或 json

java - 这些选项之间有什么不同如何在 spring 中将类设置为其他选项

java - 使用 JPA 查询注释更新查询至 Oracle 11g 挂起

java - JFrame 将三个按钮放在中间

java - 应用引擎java : debugging servlet

spring-boot - 如何从 Spring Boot 应用程序的所有子包中注册 bean?

java - 如何将实体分布在 Spring-data-jpa 和 eclipselink 中的不同模块上?