一个实体类
@Entity
@Table(name = "foo")
class Foo {
...
private String symbol;
private String name;
...
}
现在,我需要有一个SpringDataJPA方法,这样它就有一个String参数,如果它的symbol
属性与该参数匹配,它就会返回一个实体。如果name属性与参数部分匹配,则可能返回实体。搜索顺序应为先symbol
,然后name
。我问这方面的Maven如何想出这样一个方法,经过七轮,我没有正确的方法,方法如下。
default Optional<Foo> findBySymbolOrName(String term) {
Specification<Foo> spec = Specification.where(
(root, query, cb) -> cb.equal(root.get("symbol"), term)
);
Optional<Foo> foo = findOne(spec);
if (foo.isPresent()) {
return foo;
}
spec = Specification.where(
(root, query, cb) -> cb.like(root.get("name"), "%" + term + "%")
);
return findOne(spec);
}
对于此版本,问题与fineOne
方法有关:
类型参数“S”的推断类型“S”不在其界限内;应扩展“com.abc.domain.Foo”
如果将findOne
替换为
Optional<Stock> findById(Specification<Foo> spec);
IDE显示多个错误
无法解析导入存储库和的类中的符号“FooRepository "
无法解析方法“existsById(Long)”
在类中使用方法。存储库定义为
@SuppressWarnings("unused")
@Repository
public interface FooRepository extends JpaRepository<Foo, Long> { ...}
如何有一个正确的方法?
1条答案
按热度按时间tkclm6bt1#
除了
JpaRepository
之外,您的存储库还应该扩展JpaSpecificationExecutor
,JpaSpecificationExecutor
为Specification
的执行提供了几种方法,包括Optional<T> findOne(Specification<T> spec)
。