如何使用HQL从一个表中选择一个参数唯一的表?

问题描述

我需要按Feedreference_id)从ref_id表中选择所有唯一行

Feed table

我写了一个请求,但是该请求没有返回唯一值,而是使所有行都包含具有相同ref_id的重复行。 所以选择不能正确地工作

期望的是:

What is expected

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...