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 楼答案
Spring Data提供适合您需求的JpaSpecificationExecutor
https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaSpecificationExecutor.html
规范有一个谓词方法:
它有一个CriteriaBuilder,所以理论上你仍然需要定义你需要匹配的内容,但是你不需要创建多个findByXYZ
{cdl}要扩展您的规范^
用法示例:
https://www.baeldung.com/spring-data-criteria-queries