Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用spring数据jpa处理URI类型的属性?_Java_Spring_Spring Data Jpa - Fatal编程技术网

Java 如何使用spring数据jpa处理URI类型的属性?

Java 如何使用spring数据jpa处理URI类型的属性?,java,spring,spring-data-jpa,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 ArticleRe

假设有一个实体

@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);
}
公共接口ArticleRepository扩展了Crudepository{
可选的findByLink(URI链接);
}
但是使用
findByLink(URI)
方法失败,参数值为
InvalidDataAccessApiUsageException:[http://foo.de/foo.html]与预期类型[java.lang.String(n/a)]不匹配。
。这当然可以通过将参数类型更改为string来避免。但是,在查询之前,必须将每个
URI
转换为字符串


如果必须使用spring数据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);
    }
}
选项2

我尝试了选项1,可以确认它是否正常工作-但选项2是理论性的-我认为您使用的是JPA字段访问-因此JPA使用字段访问您的实体-我认为如果您更改对
属性的访问权
JPA应该使用您的getter和setter-它们具有正确的类型,因此您的代码可以正常工作

使用映射注释的位置推断访问类型。如果对字段进行注释,则可以访问字段-如果对getter进行注释,则可以访问属性。还有一个实体级注释用于设置访问级别
javax.persistence.access

@Access(PROPERTY)
尝试使用上面的注释对实体进行注释,并尝试一下。

检查以下内容:
@Access(PROPERTY)