假设我在应用程序中具有以下模型:
@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
对特定的machine
和state
对排序的所有计算机(无重复)。
我有:
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个条目,分别表示相同的machine
和state
和不同的date
,因此我通过该连接获得2个结果。在这种情况下,我只想获得一个匹配项(对应于MachineStateHistory
值更大的date
条目)。
在普通SQL中,我可以在联接内进行子选择以将其过滤掉,但是我不知道在QueryDSL中是否可以实现。
是否有想法解决/解决这个问题而无需更改模型?