问题描述
我需要按Feed
(reference_id
)从ref_id
表中选择所有唯一行
我写了一个请求,但是该请求没有返回唯一值,而是使所有行都包含具有相同ref_id
的重复行。
所以选择不能正确地工作
期望的是:
@Query("SELECT o FROM FeedEntity o WHERE o.referenceId IN (SELECT DISTINCT ol.referenceId FROM FeedEntity ol) AND o.id < :lastId")
List<FeedEntity> getByIdBefore(@Param("lastId") Long lastId,Pageable pageable);
这是为请求映射的类:
public class FeedEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id")
private UserEntity user;
@Enumerated
@Column(name = "type")
private FeedType type;
@Column(name = "ref_id")
private Long referenceId;
@Column(name = "create_time")
private Timestamp createTime;
public FeedEntity(UserEntity user,FeedType type,Long referenceId) {
this.user = user;
this.type = type;
this.referenceId = referenceId;
this.createTime = DateTimeUtil.getCurrentTimestamp();
}
}
本地查询有效
SELECT * FROM feed
WHERE id IN (
SELECT DISTINCT MIN(Id)
FROM feed fe
GROUP BY fe.ref_id
)
解决方法
希望您能意识到您同时发布了问题和答案 这个
SELECT o FROM FeedEntity o
WHERE o.referenceId IN
(SELECT DISTINCT ol.referenceId
FROM FeedEntity ol)
AND o.id < :lastId
与
不同SELECT * FROM feed
WHERE id IN (
SELECT DISTINCT MIN(Id)
FROM feed fe
GROUP BY fe.ref_id
)
您为什么会期望得到相同的结果。
您已经有了查询,只需使用它即可。根据您提供的屏幕截图,我建议的唯一区别是,将结果中的ID换为654和655,将MIN换成MAX,而MIN版本则返回622和655。
@Query("SELECT o FROM FeedEntity o WHERE o.id IN (SELECT MAX(ol.id) FROM FeedEntity ol GROUP BY ReferenceId) AND o.id < :lastId")
List<FeedEntity> getByIdBefore(@Param("lastId") Long lastId,Pageable pageable);