当前位置: 首页 > 知识库问答 >
问题:

为基于oneTomany关系的查询编写queryDSL谓词查询

单于煌
2023-03-14

我正在使用spring-data、QueryDSL和MySQL。

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

返回所有包含姓名的员工(在first_name和last_name中),并从该结果中获得的证书在2014年12月22日至2015年12月22日之间

我尝试了它,但无法获得如何以QueryDSL方式迭代每个员工的每个证书并返回员工列表。

您的回应将非常感谢!!

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

共有1个答案

洪旻
2023-03-14

最简单的做法是反转它并查询证书,这很简单,然后可以从返回的证书中获取员工。

QCertificate certificate = QCertificate.certificate;
BooleanExpression a = certificate.date.between(d1, d2);
BooleanExpression b = certificate.employee.forename.eq("name").
      or(certificate.employee.surname.eq("name"));

certificateRepository.findAll(a.and(b));

如果要查询员工,请尝试以下针对QueryDSL Version4.1.3的操作。

    QEmployee employee = QEmployee.employee;
    QCertificate certificate = QCertificate.certificate;

    BooleanExpression a = employee.forename.eq("name").or(employee.surname.eq("name"));

    BooleanExpression b = employee.certificates.contains(
        JPAExpressions.selectFrom(certificate).
          where(certificate.employee.eq(employee).
           and(certificate.date.between(d1, d2))));

    userRepository.findAll(a.and(b));
 类似资料:
  • 环境是Java、Spring-boot、Hibernat、QueryDSL、MySQL。 我有表结构 艾碧索 更新 为了澄清起见,支持UI视图的DTO包含“casename”属性。它是在将域对象转换为DTO时在服务层创建的:

  • 我正在使用Ebean和Play 2框架,并得到两个模型:用户模型和图书模型。用户模型与图书模型以一对多关系连接。所以每个用户可以有很多书或者根本没有书。图书模式本身也有其特性。现在我想在用户模型中创建一个查询,它只返回用户,这些用户拥有具有某些属性的书籍。例如:一个属性可能是条件,如新建或使用。现在给我所有有新条件的书的用户。是否可以使用Ebean方法创建这样的查询?还是我必须使用原始SQL?

  • 我有一个淡褐色IMAP看起来像 在val1,val2上建立索引我正在尝试获取say

  • 我在Spring Cloud Gateway上工作,我想用查询谓词定义一个路由,当任何查询参数值匹配时,这个路由应该匹配。 例如:我正在寻找一个场景,其中单个查询谓词可以获取多个匹配值。这可能吗? Spring Cloud 文档仅讨论如何匹配查询谓词的单个值 - https://cloud.spring.io/spring-cloud-gateway/multi/multi_gateway-req

  • 我想根据ModelB中的用户从modelA中获取数据。但这并不是强制要求我在ModelB中为每一个记录都有记录。所以当我使用下面的代码来获取数据时,它返回0条记录。 当我调试时,我发现QueryDsl将交叉联接。有人能告诉我如何修复这个问题吗?querydsl有没有办法添加左联接而不是交叉联接?下面是我的两个模型。

  • 我使用Spring数据、QueryDSL和MySQL。 我想在queryDSL方法中这样查询。一个具体的例子只是一个简单的例子来给出一个想法。 例如,有两个表Employee和Certificate。两个之间的关系是一个(员工)对多个(证书) 以下是表 以下是这些实体, 谢谢你