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)