简体   繁体   English

坚持如何在 spring 数据应用程序中找到 QueryDSL 谓词

[英]Stuck on how to find QueryDSL predicate in spring data app

I have a problem in querying some data, I will explain my problem briefly and set an example for clarification我在查询一些数据时遇到问题,我将简要解释我的问题并举例说明

I use Spring data, QueryDSL and MySQL.我使用 Spring 数据、QueryDSL 和 MySQL。

I want to query like this in queryDSL method.我想在 queryDSL 方法中这样查询。 A specific example is just a simple example to give an idea.一个具体的例子只是一个简单的例子来给出一个想法。

Say for example, there are two tables Employee and Certificate.例如,有两个表 Employee 和 Certificate。 Relation between two is ONE (Employee) to MANY (Certificate)两者之间的关系是 ONE(员工)到 MANY(证书)

Following are tables以下是表格

Employee (id, first_name, last_name);
Certificate (id, name, date, fk_emp);

Following are the entities,以下是实体,

@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;
}

What should the QueryDSL predicate be for Returning all employees with name contains (in first_name and last_name) and from that result whose certification between date 22-12-2014 to 22-12-2015 QueryDSL 谓词应该是什么来返回所有姓名包含(在名字和姓氏中)的员工以及从日期在 22-12-2014 到 22-12-2015 之间认证的结果

At the same time, I want to obtain all employees who do not have any certificates同时,我想获得所有没有任何证书的员工

example of results:结果示例:

+----+--------------------+---------------------+--------+
| 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  |
+----+--------------------+---------------------+--------+

Thank you谢谢

Native JPQL Query:原生 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 join variant: Querydsl 连接变体:

query.from(employee)
    .leftJoin(employee.certificates, certificate)
    .on(certificate.date.between('from_date', 'to_date'))
    .list(employee);

Note: Date format can be different here and please change according to your need注意:这里的日期格式可以不同,请根据您的需要更改

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM