[英]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.