[英]How to filter by calculated field using Querydsl Predicate (BooleanExpression) with Spring Data?
[英]Stuck on how to find QueryDSL predicate in spring data app
我在查詢一些數據時遇到問題,我將簡要解釋我的問題並舉例說明
我使用 Spring 數據、QueryDSL 和 MySQL。
我想在 queryDSL 方法中這樣查詢。 一個具體的例子只是一個簡單的例子來給出一個想法。
例如,有兩個表 Employee 和 Certificate。 兩者之間的關系是 ONE(員工)到 MANY(證書)
以下是表格
Employee (id, first_name, last_name);
Certificate (id, name, date, fk_emp);
以下是實體,
@Entity
@Table(name = "EMPLOYEE")
class Employee {
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
@OneToMany(mappedBy = "employee", cascade = CascadeType.ALL)
private List<Certificate> certificates = new ArrayList<>();
}
@Entity
@Table(name = "CERTIFICATE")
class Certificate {
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "CERTIFICATE_NAME")
private String certificateName;
@Column(name = "DATE")
private Date date;
@ManyToOne
@JoinColumn(name = "REF_EMPLOYEE")
private Employee employee;
}
QueryDSL 謂詞應該是什么來返回所有姓名包含(在名字和姓氏中)的員工以及從日期在 22-12-2014 到 22-12-2015 之間認證的結果
同時,我想獲得所有沒有任何證書的員工
結果示例:
+----+--------------------+---------------------+--------+
| id | name | date | fk_emp |
+----+--------------------+---------------------+--------+
| 1 | FirstName LastName | 2014-02-01 00:00:00 | 11111 |
+----+--------------------+---------------------+--------+
| 2 | FirstName LastName | 2014-03-01 00:00:00 | null |
+----+--------------------+---------------------+--------+
| 3 | FirstName LastName | 2014-04-01 00:00:00 | |
+----+--------------------+---------------------+--------+
| 5 | FirstName LastName | 2014-05-01 00:00:00 | |
+----+--------------------+---------------------+--------+
| 12 | FirstName LastName | 2014-06-01 00:00:00 | 25555 |
+----+--------------------+---------------------+--------+
| 13 | FirstName LastName | 2014-07-01 00:00:00 | 78888 |
+----+--------------------+---------------------+--------+
| 16 | FirstName LastName | 2014-08-01 00:00:00 | null |
+----+--------------------+---------------------+--------+
謝謝
原生 JPQL 查詢:
SELECT * FROM EMPLOYEE A
LEFT JOIN CERTIFICATE B ON A.ID = B.REF_EMPLOYEE AND DATE BETWEEN CAST('2014-12-22' AS DATE) AND CAST('2015-12-22' AS DATE);
Querydsl 連接變體:
query.from(employee)
.leftJoin(employee.certificates, certificate)
.on(certificate.date.between('from_date', 'to_date'))
.list(employee);
注意:這里的日期格式可以不同,請根據您的需要更改
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.