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

禁用从方法名称创建查询-使用投影

柴兴修
2023-03-14

我想使用Spring数据投影技术,以便仅从表中提取一些字段(而不是表中的所有字段)。

如留档(https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections)中所述,我创建了一个简单的界面,例如:

interface NamesOnly {
  String getFirstname();
  String getLastname();
}

但我在使用它时遇到了一些问题。

问题1:

首先,我想使用名称findAll()创建一个查询,查找只有两个字段(firstName和lastName)的所有行:

@Repository
public interface PersonaRepository extends JpaRepository<Persona, Long> {
    List<NamesOnly> findAll();
}

但在这种情况下,我有这些错误(可能是因为findAll()是一种JpaRepository的方法):

  • 实现org.springframework.data.jpa.repository.JpaRepository.find所有
  • 返回类型与JpaRepository.findAll()不兼容

问题2:

好的,所以我尝试将方法的名称更改为findAllOnlyNames():

@Repository
public interface PersonaRepository extends JpaRepository<Persona, Long> {
    List<NamesOnly> findAllOnlyNames();
}

但现在我有一个错误:

原因:org.springframework.data.mapping.属性引用异常:没有属性findAllOnlyNames找到类型角色!

因为Spring尝试从名称创建查询。

1) 有没有可能重用方法名findAll(),而不出现JpaRepository问题?

2) 是否可以从方法名称关闭查询创建(仅针对某些查询,而不是针对所有项目或存储库)?

共有2个答案

澹台景山
2023-03-14

您可以指定显式查询,而不是依赖它从方法名称派生。

@Repository
public interface PersonaRepository extends JpaRepository<Persona, Long> {
    @Query("select p from Persona p")
    List<NamesOnly> findAllOnlyNames();
}

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query

重写findAll()(即使在不太可能的情况下也是可能的)可能是个坏主意。

斜成济
2023-03-14

您的方法是正确的,您的findAll()与现有Spring数据接口上指定的冲突,您可以重命名它(正如您所尝试的那样),但它仍然必须是与查询派生机制兼容的名称。请尝试以下操作:

@Repository
public interface PersonaRepository extends JpaRepository<Persona, Long> {
    List<NamesOnly> findAllOnlyNamesBy();
}

Spring数据JPA文档的这一部分解释了查询创建过程的工作原理:

该机制从方法中去除前缀“find…By”、“read…By”、“query…By”、“count…By”和“get…By”,并开始解析其余部分。

因此,您只需要在方法名称中添加关键字,该关键字之后的任何内容都被视为条件,在这种情况下,没有条件,因此它会获取所有内容。

要从方法名称禁用查询派生,您需要向方法添加@Query(...)注释,并改为指定JPA或本机查询。

 类似资料:
  • 我在用户和电话号码之间有一种“一对一”的关系。因此,一个用户可以有多个电话号码。 在前端,我必须只提取登录用户的电话号码,或者如果用户是管理员,我必须显示所有用户的电话号码。我已经设法实现了这一部分,但我遇到的问题如下:在前端,用户还有一个“电话号码”搜索框。因此,如果用户或管理员搜索987(比如前3位数字),则应显示包含“987”且与其个人资料相关联的任何电话号码。如果用户是管理员,我应该显示包

  • 我想知道是否可以不需要@Query注释,让Spring Data根据我的方法名称和下面实体关系的方法参数构造JPA查询。我想检索与特定Item相关的ItemLocations列表。我尝试了下面的签名,但没有@Query它不起作用。传入Item.id而不是Item对象本身是否更合适(高效/有效)? Spring数据版本:1.3.4。发布 工作Spring数据存储库API: 所需的Spring数据存储

  • 基础Spring Data repository内置的查询生成器机制对于创建实体仓库的约束查询是有用的,它会从方法名中去掉find…By,read…By,query…By,count…By和get…By这些前缀并解析剩下的内容.这些前缀还能包含更多的表达式例如Distinct,设置一个distinct标志并在查询中创建它,然后第一个By的动作就像一个分隔符来表明查询实际标准的开始。最基本的方式你可

  • 我想使用PHP OOP创建一个简单的CRUD而不需要任何框架 下面是我编写的执行简单SQL更新查询的代码 呼叫更新功能 但是你知道如何在oop更新查询中处理吗? 如 还是多个添加? 请看一下我的代码注释,了解一下我的头绪在哪里。 如果有人能用简单的术语解释这一点,我需要做什么来改变它?? 这会帮我的忙。 非常感谢

  • 问题内容: 我想在MS SQL中使用hibernate模式创建一个对象,该表的名称为“ user”。这没用!。我认为此问题可能是由表/实体的名称引起的,用户是关键字。拥有名称为“ user”的表该怎么办? 问题答案: 我应该使用重音符号()。