我在查询某些数据时遇到问题,我将简要说明我的问题并提供示例以进行澄清
我使用Spring数据,QueryDSL和MySQL。
我想在queryDSL方法中这样查询。一个特定的例子只是一个简单的例子,可以给出一个想法。
例如,有两个表Employee和Certificate。两者之间的关系是一个(雇员)到许多(证书)
以下表格
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谓词应用于什么返回所有具有名称的雇员(在first_name和last_name中),并且从该结果中返回其证书的日期为2014年12月22日至2015年12月22日
同时,我想获得所有没有任何证书的员工
结果示例:
+----+--------------------+---------------------+--------+
| 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);
注意:此处的日期格式可以不同,请根据需要更改