java 如何编写一个方法,返回一个属性匹配或另一个属性部分匹配的实体?

carvr3hs  于 2023-03-16  发布在  Java
关注(0)|答案(1)|浏览(136)

一个实体类

@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> { ...}

如何有一个正确的方法?

tkclm6bt

tkclm6bt1#

除了JpaRepository之外,您的存储库还应该扩展JpaSpecificationExecutorJpaSpecificationExecutorSpecification的执行提供了几种方法,包括Optional<T> findOne(Specification<T> spec)

public interface FooRepository extends JpaRepository<Foo, Long>, JpaSpecificationExecutor<Foo> { ... }

相关问题