![](/img/trans.png)
[英]How to use order by and Limit in Spring Data JPA using QueryDSL
[英]How to perform queries on hierarchical entities using querydsl or spring data jpa specification?
我有一個這樣的實體層次結構。 除了一些常見的屬性外,一些屬性僅由幾個子類型共享:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Person {
private String firstName;
private String lastName
... further properties, getters and setters...
}
@Entity
public class Employee extends Person {
private String salary;
... further properties, getters and setters...
}
@Entity
public class BoardMember extends Person {
private String salary;
... further properties, getters and setters...
}
@Entity
public class ExternalMember extends Person {
private String clearanceLevel;
... further properties, getters and setters...
}
@Repository
public interface PersonRepository extends JpaRepository<Person, Long>, QuerydslPredicateExecutor<Person> {
}
使用 QueryDSL 我試圖根據這樣的動態過濾條件搜索人員:
@Service
@Transactional
public class PersonService {
@Autowired
PersonRepository personRepository;
public Page<Person> search(String firstName, String salary) {
var searchCriterias = new BooleanBuilder();
if (firstName != null) {
searchCriterias.and(QPerson.firstName.eq(firstName));
}
if (salary != null) {
searchCriterias.andAnyOf(
QPerson.person.as(QEmployee.class).salary.eq(salary),
QPerson.person.as(QBoardMember.class).salary.eq(salary),
);
}
personRepository.findAll(searchCriterias);
}
}
這似乎不是正確的方法,但是,我收到了很多錯誤,例如“薪水”而不是 Person 的成員。
處理分層實體搜索的各種方法是什么? 為了類型安全,我更喜歡 QueryDSL,但使用 Spring Data Specification 的解決方案也很好。
編輯:使用 15 種以上不同的搜索條件,搜索條件可能會變得非常復雜。 所以我需要一種程序化的方法來制定它們。
我無法重現“不是 Person 的成員”錯誤,但我設法從您的查詢中獲得了結果。
按照Baeldung 的教程並根據您的問題調整代碼,我設法獲得了沒有錯誤的結果。 這是示例項目。 希望這可以幫助
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column
private String firstName;
@Column
private String lastName;
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public Person() {
}
}
import javax.persistence.Column;
import javax.persistence.Entity;
@Entity
public class BoardMember extends Person {
@Column
private String salary;
public BoardMember(String firstName, String lastName, String salary) {
super(firstName, lastName);
this.salary = salary;
}
public BoardMember() {
}
}
@Service
@Transactional
public class PersonService {
@Autowired
PersonRepository personRepository;
public List<Person> search(String firstName, String salary) {
var searchCriterias = new BooleanBuilder();
if (firstName != null) {
searchCriterias.and(QPerson.person.firstName.eq(firstName));
}
if (salary != null) {
searchCriterias.andAnyOf(
QPerson.person.as(QEmployee.class).salary.eq(salary),
QPerson.person.as(QBoardMember.class).salary.eq(salary)
);
}
var result = new ArrayList<Person>();
for (Person person : personRepository.findAll(searchCriterias)) {
result.add(person);
}
return result;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.