【问题标题】:How to select from a table using HQL that are unique by one parameter?如何使用一个参数唯一的 HQL 从表中进行选择?
【发布时间】:2020-12-29 00:30:35
【问题描述】:

我需要通过reference_id (ref_id) 从Feed 表中选择所有唯一行

我写了一个请求,但该请求不返回唯一值,而是给出了所有行包括具有相同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
)

【问题讨论】:

  • 您希望在结果中包含相同ref_id 的所有Feed 行吗?

标签: mysql sql spring hibernate hql


【解决方案1】:

我希望您确实意识到您发布了问题和答案 这个

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
)

为什么你会期待同样的结果。

您已经有了查询,只需使用它。根据您提供的屏幕截图,我建议的唯一区别是将 MIN 换成 MAX,因为您希望结果中的 id 654 和 655,而 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2015-05-06
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多