坚持如何在spring data应用程序中查找QueryDSL谓词

问题描述 投票:0回答:1

我在查询某些数据时遇到问题,我将简要说明我的问题并提供示例以进行澄清

我使用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  |
+----+--------------------+---------------------+--------+

谢谢

java mysql spring-data-jpa spring-data querydsl
1个回答
0
投票

本地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);

注意:此处的日期格式可以不同,请根据需要更改

© www.soinside.com 2019 - 2024. All rights reserved.