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

时间:2015-11-18 13:53:11

标签: java spring spring-data-jpa

假设有一个实体

public List<string> items = new List<string> {"one", "two", "three"};
private int index = 0;

void nextItem() {
    if (index < items.Count - 1)
        index += 1;
    else
        index = 0;

    setItem();
}

void previousItem() {
    if (index > 0)
        index -= 1;
    else
        index = items.Count - 1;

    setItem();
}

void Update() {
         if (Input.GetKeyDown(KeyCode.RightArrow)) nextItem();
    else if (Input.GetKeyDown(KeyCode.LeftArrow))  previousItem();
}

和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();
  }
}

但使用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)]转换为字符串。

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

1 个答案:

答案 0 :(得分:5)

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

选项1

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

这看起来像这样:

@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使用字段访问您的实体 - 我想如果您更改对{{1}的访问权限JPA应该使用你的getter和setter - 它们具有正确的类型,因此你的代码可以正常工作。

使用映射注释的位置推断访问类型。如果您对字段进行注释,则可以获得字段访问权限 - 如果您对获取者进行注释,则可以访问该属性。还有一个实体级注释来设置访问级别PROPERTY

javax.persistence.Access

尝试使用上面的注释对您的实体进行注释,并尝试一下。