Spring Data JPA:如何在ORDER BY中使用DISTINCT?

10 浏览
0 Comments

Spring Data JPA:如何在ORDER BY中使用DISTINCT?

我遇到了以下错误:

ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list

以下是我的模型和查询:

// 模型:
@Entity
@Table(name = "Book")
@Data
public class Book {
    @Id
    private String id;
    @OneToMany
    private List category;
}
@Entity
@Table(name="Category")
@Data
public class Category {
    @Id
    private int id;    
    private String category;
}
// 
@Repository
public interface BookDao extends JpaRepository {
    @Query("SELECT DISTINCT b FROM Book b join b.category c order by c.id DESC")
    Page getByBookIdDESC(Pageable pageable);
}

我尝试过的方法:在选择列表中提供b.category。

    @Query("SELECT DISTINCT b, c.id FROM Book b join b.category c order by c.id DESC")
    Page getByBookIdDESC(Pageable pageable);

然而,这仍然提供了重复的结果。

0
0 Comments

Spring Data JPA是一个用于简化数据库访问的框架。在使用Spring Data JPA时,有时候需要对查询结果进行去重,并按照特定的列进行排序。本文将介绍在Spring Data JPA中如何使用DISTINCT和ORDER BY。

问题:如何在Spring Data JPA中使用DISTINCT和ORDER BY?

解决方法:可以尝试使用union操作来实现。以下是一个示例代码:

select distinct country
from (
    select country, theOrderColumn from table1
    union all
    select country, theOrderColumn from table2
) a 
order by theOrderColumn

以上代码中,首先对两个表table1和table2进行union操作,然后使用DISTINCT去除重复的country值。最后,按照theOrderColumn列进行排序。

在Spring Data JPA中,可以使用原生SQL语句来执行上述操作。下面是一个使用Spring Data JPA的示例代码:

@Repository
public interface MyRepository extends JpaRepository {
    @Query(nativeQuery = true, value = "select distinct country from (select country, theOrderColumn from table1 union all select country, theOrderColumn from table2) a order by theOrderColumn")
    List findDistinctCountriesOrderedByTheOrderColumn();
}

以上代码中,使用@Query注解指定了原生SQL语句,并通过nativeQuery属性设置为true来启用原生SQL查询。在方法声明中,返回类型为List,表示返回的结果是去重后的country列表,并按照theOrderColumn进行排序。

通过以上方法,我们可以在Spring Data JPA中使用DISTINCT和ORDER BY来对查询结果进行去重和排序。这样可以更灵活地处理数据库查询需求,提高开发效率。

0
0 Comments

Spring Data JPA是一个用于简化数据库访问的框架。在使用Spring Data JPA时,有一个问题是如何在ORDER BY子句中使用DISTINCT关键字。

在一个书籍(Book)和分类(Category)之间存在一对多的关系,一个书籍可以属于多个分类,因此在结果集中可能会出现重复的书籍。为了去重,作者尝试使用DISTINCT关键字。

在作者提到的情况下,使用c.id作为去重的依据,但是属于同一分类的书籍仍然是重复的。这是正常的,因为DISTINCT关键字会对整个数据进行去重,包括c.id和书籍数据。作者尝试去掉SELECT子句中的c.id来测试去重的唯一性。

正如您在作者的帖子中看到的,作者在SELECT子句中删除了c.id。这就是作者最初的做法,但是返回了错误消息:ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list。

解决这个问题的方法是同时删除ORDER BY子句。如果您要查找不重复的书籍或分类,您应该在SELECT和ORDER BY子句中不使用分类实体。如果您要查找不重复的分类和属于这些分类的书籍,您可以在SELECT和ORDER BY子句中使用分类,但是您应该期望到属于相同分类的重复书籍。

0