有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpringDataJPA一种用于多个findBy查询的方法

我有这个JobPosting类和这个实体的存储库接口。我想能够搜索所有的公司,技能,职位和职位类别的城市字段组合。我知道的唯一方法是在存储库接口中创建一个不同的方法。例如,为了按城市和标题进行搜索,我需要创建一个名为findbycityidandlecontaining(长id,字符串title)的方法。为了按技能和标题进行搜索,我需要创建一个名为lfindbyskillsidandlecontaining(长id,字符串title)的方法。问题是,如果我为每种可能性创建不同的方法,就会有太多的方法。还有更好的办法吗

实体(我在这里没有包括get set方法):

@Entity
public class JobPosting
{
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    @ManyToOne
    private Company company;
    private Date publishedAt;
    private String title,description;
    private boolean isActive;
    @ManyToOne
    private City city;
    @ManyToMany
    @JoinTable(name="job_posting_skill",joinColumns=@JoinColumn(name="job_posting_id"),inverseJoinColumns=@JoinColumn(name="skill_id"))
    private Set<Skill> skills;
}

存储库:

package app.repository;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import app.entity.JobPosting;

public interface JobPostingRepository extends JpaRepository<JobPosting,Long>
{
    Page<JobPosting> findAll(Pageable pageable);
    List<JobPosting> findByCompanyId(long companyId);
    List<JobPosting> findByTitleContaining(String title);
    List<JobPosting> findBySkillsId(Long id);
    List<JobPosting> findByCityId(Long id);
}

共 (1) 个答案

  1. # 1 楼答案

    Spring Data提供适合您需求的JpaSpecificationExecutor

    https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaSpecificationExecutor.html

    List<T>     findAll(Specification<T> spec)
    Returns all entities matching the given Specification.
    

    规范有一个谓词方法:

    interface Specification<T> {
        Predicate toPredicate(Root<T> root, CriteriaQuery query, CriteriaBuilder cb);
    }
    

    它有一个CriteriaBuilder,所以理论上你仍然需要定义你需要匹配的内容,但是你不需要创建多个findByXYZ

    {cdl}要扩展您的规范^

    用法示例:

    https://www.baeldung.com/spring-data-criteria-queries