假设有一个实体
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
类型属性的最佳方法是什么?
答案 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
尝试使用上面的注释对您的实体进行注释,并尝试一下。