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

Spring JPA:在同一查询界面上使用多个投影

南门新荣
2023-03-14

我正在尝试使用Spring JPA的投影从查询结果中过滤掉不必要的数据。但是,我有多个投影需要在同一个接口方法上使用。

问题是,我试图用不同的返回对象从同一方法查询数据,但java不允许这样做。

查询是由JPA根据方法名称自动生成的,因此我无法更改方法名称。

除了创建一个新的界面,还有其他选择吗?因为我认为这很麻烦,也没有必要

这是我正在尝试做的事情的示例代码。

自动生成的查询

public interface UserRepository extends CrudRepository<UserAccount, Long> {

    AuthenticateProjection getByUsername(String username);

    UserDetailsProjection getByUsername(String username);

}

投影图

public interface AuthenticateProjection {

    @Value("#{target.username}")
    String getUsername();

    @Value("#{target.credentail.token}")
    String getHashPassword();
}

public interface UserDetailsProjection {

    @Value("#{target.username}")
    String getUsername();

    @Value("#{target.firstname}")
    String getFirstName();

    @Value("#{target.lastname}")
    String getLastName();
}

共有2个答案

祁曦哲
2023-03-14

只需在get(或例如find)和By(以大写字符开头)之间添加一些内容。它在查询生成中被忽略。

public interface UserRepository extends CrudRepository<UserAccount, Long> {

   AuthenticateProjection getByUsername(String username);

   UserDetailsProjection getAnotherByUsername(String username);

}
陶高峯
2023-03-14

所以我已经设法弄清楚如何在单个查询中使用多个投影。

<T> T getByUsername(String username, Class<T> projection)

这允许方法调用方指定要应用于查询的投影类型。

为了进一步改进这一点,使其不易出错,我制作了一个空白接口,投影必须扩展该接口,以便能够将类插入到参数中。

public interface JPAProjection {
}

public interface UserRepository extends CrudRepository<UserAccount, Long> {
    <T extends JPAProjection > T getByUsername(String username, Class<? extends JPAProjection> projection);
}

投影界面

public interface UserDetailsProjection extends JPAProjection{
    @Value("#{target.username}")
    String getUsername();

    @Value("#{target.firstname}")
    String getFirstname();

    @Value("#{target.lastname}")
    String getLastname();
}

然后我可以通过调用查询方法

getByUsername("...", UserDetailsProjection.class)
 类似资料:
  • 在我的Spring Boot应用程序中有POJO,下面是它的样子: 现在我想选择所有与给定值相关的方式是POJO的成员。 所以这是我的查询

  • 问题内容: 我正在尝试在Mock上使用Mockito来执行此操作: 当使用parameter1 调用Mock.someMethod(..)->返回result1 当使用parameter2调用Mock.someMethod(..)时-> return result2 当Mock.someMethod (..)用参数3调用->返回result3 但是Mockito正确地对第一个进行了存根,但是在第二

  • 我将编写此查询,它在Console中工作。sql或Workbench中,但当我在@Query中使用它时,我得到了一个语法错误! 在我的IDE中,错误是在下次选择

  • 问题内容: 我正在寻找一种处理以下情况的方法: 我们有一个数据库服务器,上面有多个数据库(所有数据库都有相同的架构,不同的数据)。 我们正在寻找一种查询所有数据库的方法(并且它易于配置,因为可以随时添加更多数据库)。此数据访问必须是实时的。 举例来说,假设您有一个插入订单的应用程序- 每个应用程序都有自己的数据库等。我们正在寻找的是一种有效的方式,使单个应用程序可以访问所有其他数据库中的订单信息,

  • 问题内容: 我有一个包含多个CTE的相当复杂的查询,但是其他人都从中提取了1个主要CTE,这是否会导致该主要CTE多次执行? 问题答案: 您可以这样使用CROSS JOIN: 这将防止的多次执行(有关实际执行计划,请参见属性)。 示例:如果执行此查询 使用数据库,那么实际的执行计划将是

  • 问题内容: 我在这里找到了一些可以更新一个字段的东西:http : //www.karlrixon.co.uk/articles/sql/update-multiple-rows-with-different- values-and-a-single-sql- query/ 我的问题是如何更新多个字段?如: 这当然是行不通的。尝试了其他几种组合并失败了。任何的想法?谢谢! 问题答案: