QueryDSL:如何解决在联接中进行子查询的问题?

时间:2019-09-02 14:46:09

标签: java querydsl

假设我在应用程序中具有以下模型:

@Entity
public class Machine {

  @Id
  @GeneratedValue
  private Long id;

  @Enumerated(EnumType.STRING)
  private State currentState;

}

@Entity
public class MachineStateHistory {

  @Id
  @GeneratedValue
  private Long id;

  @ManyToOne
  private Machine machine;

  @Enumerated(EnumType.STRING)
  private State state;

  private LocalDateTime date;

  @PrePersist
  public void onCreated() {
    this.createdDate = LocalDateTime.now();
  }

}


public enum State {
  A, B, C
}

我想使用QueryDSL来获取MachineStateHistory中最新的date对特定的machinestate对排序的所有计算机(无重复)。

我有:

return queryFactory.selectFrom(machine)
    .leftJoin(machineStateHistory).on(machine.eq(machineStateHistory.machine).and(machineStateHistory.state.eq(state)))
    .orderBy(machineStateHistory.date.desc())
    .distinct()
    .fetch();

但是,如果机器两次处于状态A,则MachineStateHistory中有2个条目,分别表示相同的machinestate和不同的date,因此我通过该连接获得2个结果。在这种情况下,我只想获得一个匹配项(对应于MachineStateHistory值更大的date条目)。

在普通SQL中,我可以在联接内进行子选择以将其过滤掉,但是我不知道在QueryDSL中是否可以实现。

是否有想法解决/解决这个问题而无需更改模型?

0 个答案:

没有答案