当前位置: 首页 > 知识库问答 >
问题:

使用Spring数据JpaRepository获取不同的列值

颛孙昆
2023-03-14

我有这个实体(为简洁起见省略注释):

@Entity
class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Lob
    private String category;

    @Lob
    private String name;

    @Lob
    private String customer_number;

    // more attributes omitted
}

我必须得到一个不同的类别值的列表为一个特定的uid

在我的JpaRepository中我有以下内容:

@Query("SELECT DISTINCT product.category FROM Product as product WHERE product.customerNumber = :cn ORDER BY product.category")
Page<String> findDistinctCategoryByCustomerNumber(String cn,
                                                  Pageable pageable);

如果没有@Query注释,则返回ID,而不是类别值。生成的SQL如下所示:

select distinct product0_.id as id1_0_, product0_.customer_number as customer2_0_, product0_.category as directory3_0_, product0_.name as name4_0_ from product product0_ 
where product0_.customer_number=? 
order by product0_.id desc limit ?

但我需要的是不同的类别,而不是产品实体。除此之外,我在上面添加了@Query注释。但现在我得到了这个错误:

Order by expression "PRODUCT0_.ID" must be in the result list in this case; SQL statement:
select distinct product0_.directory as col_0_0_ from product product0_ where product0_.customer_number=? order by product0_.directory, product0_.id desc limit ? [90068-197]

但是我不能将id添加到结果列表中,因为这会使与众不同无效,因为id是主键。

所以我要么需要一个合适的方法名来自动生成查询,要么需要一种方法来阻止JpaRepository将它的顺序通过子句添加到我的@Query末尾。

共有1个答案

杨高翰
2023-03-14

由于您正在请求分页结果,因此会创建不需要的order by。第n页的概念只有在结果被排序并且排序来自Pageable方法参数时才有意义。

从查询中删除order by,并将Pageablesort属性设置为按类别排序。

 类似资料:
  • 我有以下实体: 用户: 新闻来源: UsersRepository和NewsSourcesRepository是来自Spring数据JPA的简单JPA存储。其配置如下: 我的测试在第15行抛出一个LazyInitializationException异常。信息是: 未能延迟初始化角色:新闻的集合。实体。用户。使用者新闻源,无法初始化代理-无会话 如果我将我的测试注释为@Transactional

  • 我使用的是Spring数据JpaRepository,我发现它非常容易使用。我实际上需要所有这些功能——分页、排序、过滤。不幸的是,有一件令人讨厌的事情似乎迫使我退回到普通JPA的使用上来。 我需要按关联集合的大小订购。例如,我有: 我必须按bes排序。size() 是否有办法以某种方式自定义排序,仍然利用分页、过滤和其他Spring Data的强大功能?

  • 我使用Spring引导,Spring数据JPA,我正在寻找解决方案,以获得给定表的所有列名。但没能按我的要求找到 不需要本机查询的解决方案。正在寻找使用spring数据抽象的通用解决方案。 我可以使用普通java获取列名,但我想使用spring数据JPA获取它们。

  • 我有一个用户存储库,它是这样声明的 在其中一个服务中,我想获取用户,在返回之前,我想将密码更改为虚拟文本,但我不想保存该实体。 使用实体管理器,我可以执行并获取副本,但如何使用JPARepository做到这一点? 我应该用< code > findbysusername()获取对象,然后用< code>getOne()函数使用它的id吗?

  • 我正在测试一个基于酒店搜索的场景。所以我做了3个模型类,分别是酒店、房间和可用性 下面是我们正在使用的三个模型类。 Hotel.java @文档(集合="酒店")公共类酒店{ } Room.java @文件(收集=“房间”)公共教室{ } 可利用性Java语言 @文件(收集=“房间”)公共类可用性{ } 这些存储在两个mongodb集合中,一个用于酒店,另一个用于房间和可用性。 下面是我们从中提取

  • 如何将其JPA实体配置为不获取相关实体,除非提供了特定的执行参数。 根据Spring的文件4.3.9。配置Fetch和LoadGraphs时,需要使用EntityGraph注释来指定查询的Fetch策略,但这并不能让我在运行时决定是否要加载这些实体。 我可以在单独的查询中获取子实体,但为了做到这一点,我需要将我的存储库或实体配置为不检索任何子实体。不幸的是,我似乎找不到任何关于如何执行此操作的策略