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

JPA项目的结果为空

柳业
2023-03-14

我有这些Postgres表:

create table deals_new
(
    id                  bigserial primary key,
    slip_id             text,
    deal_type           integer,
    timestamp           timestamp,
    employee_id         bigint
        constraint employee_id_fk
            references common.employees
);

create table twap
(
    id                 bigserial     primary key,
    deal_id            varchar          not null,
    employee_id        bigint
        constraint fk_twap__employee_id
            references common.employees,
    status             integer
);

create table common.employees
(
    id              bigint primary key,
    first_name      varchar(150),
    last_name       varchar(150)
);

实体:

@Entity
@NoArgsConstructor
@EqualsAndHashCode
@Getter
@Setter
@ToString
@Table(name = "deals_new")
public class DealTwap {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "slip_id")
    private String slipId;
    ...
}

@Entity
@NoArgsConstructor
@Getter
@Setter
@Table(name = "twap")
public class Twap implements Serializable {

    @Id
    @Column(name = "id")
    private long id;

    @Column(name = "deal_id")
    private String dealId;

    @Column(name = "employee_id")
    private Long employeeId;

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "slip_id", referencedColumnName = "deal_id")
    private List<Deal> deals;
}

@Entity
@Table(name = "employees")
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@Builder
@Getter
@Setter
@ToString
public class Employee {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "first_name")
    private String firstName;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "account_id")
    private Account account;
}

!!注意!!!员工与Twap之间没有关系

我创建了这个JPA存储库:

public interface DealsRepository extends JpaRepository<DealTwap, Long> {

    @Query (value =
            "SELECT e.first_name, e.last_name " +
                    "FROM common.deals_new d " +
                    "JOIN common.employees e ON e.id = d.employee_id " +
                    "LEFT OUTER JOIN common.twap t on " +
                    "        t.deal_id = d.slip_id AND " +
                    "        d.timestamp between '11-11-2010' AND '11-11-2011' AND " +
                    "        d.deal_type in (1, 2) " +
                    "OFFSET :offset " +
                    "LIMIT :limit ",
            nativeQuery = true)
    List<ResultDTO> getHistoryAllPairsSearchParam(@Param("offset") int offset,
                                                      @Param("limit") int limit);
}

如您所见,我使用此界面获得结果:

public interface ResultDTO {
    String getFirstName();
    String getLastName();
}

List<ResultDTO> list = dealsRepository.getHistoryAllPairsSearchParam(...);

    for (ResultDTO item : list) {
        System.out.println("!!!!!!!!!!!!!!! a " + item.getFirstName());
    }

当我运行代码时,我得到:

!!!!!!!!!!!!!!! a null
!!!!!!!!!!!!!!! a null
!!!!!!!!!!!!!!! a null
..........

你知道会出什么问题吗?结果我总是得到空值。当我在SQL编辑器中运行这个查询时,我得到了正确的表和结果。

共有1个答案

苏运良
2023-03-14

您正在尝试将本机查询结果映射到非实体类。如果我没有弄错,结果列名应该与方法名匹配。您是否尝试过像这样为列设置别名?

SELECT e.first_name AS firstName, e.last_name AS lastName

您还阅读了这个Spring Data JPA将本机查询结果映射到非实体POJO吗?它看起来与您的案例非常相似。

如果这没有帮助,那么看起来谷歌有很多关于如何在dto中执行本机查询结果的结果。

 类似资料:
  • 我想有一个使用Spring Boot的微服务项目,它通过通过Spring Data JPA项目创建的依赖项访问实体和DAO。这个想法是多个微服务可以获得该依赖项。 然而,当jar在Spring Boot Data JPA项目中组装时,它通过starter依赖项包含了许多依赖项。其中大多数也出现在使用它的Spring Boot Microservice项目中。 您将如何通过Spring Data J

  • 我试图通过在Eclipse中从Facets中分配“JPA facet”来将一个项目转换为启用JPA的项目。 但是,没有选择“JPA方面”的选项。 在分析之后,我发现我甚至不能用eclipse创建一个新的JPA项目,我正在使用eclipse创建一个新的JPA项目。 在这篇文章中,还提到了更新到新的Eclipse。但是,有没有什么方法可以找出现有的Eclipse中有什么问题。

  • 当默认的项目结构不适用时,可以自定义配置。查看 Gradle 文档中 Java plugin 部分以了解如何在纯 Java 项目中进行配置。 Android plugin 使用了类似的语法,但因为 Android 有自己的 sourceSets,所以需要配置到 android 块中。下面的例子使用了旧的项目结构(Eclipse),并把 androidTest 的 sourceSet 映射到 tes

  • 问题内容: 问题:我有一个姓名和地址列表。一些名字(人)与其他名字(街道,邮政编码,城镇)具有相同的地址。我想选择所有出现的地址不超过三个的名称,并从其余三个名称中选择前三个名称,每个名称都指向同一地址。例子: 结果集应为 唐纳德(Donald)失踪是因为他是地址相同的小组的第四名。可以通过UNION和子查询实现此结果吗?就像是 我知道此查询是错误的,因为它限制了出现3次以上的地址的完整结果集。我

  • 上面提到的构建文件中有默认的文件夹结构。Gradle 遵循约定优先于配置的概念,在尽可能的情况下提供合理的默认配置参数。最基本的项目有两个 “source sets” 组件,分别存放应用代码及测试代码。它们分别位于: src/main/ src/androidTest/ 里面每个存在的文件夹对应相应的源组件。对于 Java plugin 和 Android plugin 来说,它们的 Java 代

  • 当涉及制作 electron 应用程序的问题时,项目结构会有些不同。如果你以前使用过官方的 vuejs-templates/webpack 设置,那么你对这个结构应该很熟悉。本文档在此章节将尝试解释样板代码的工作原理以及应用程序在构建中的一些区别。 单一的 package.json 设置 就在不久之前,两个 package.json 的设置是必需的,但是,感谢 @electron-userland