繁体   English   中英

JPA 项目的结果是 null

[英]Result from JPA project is null

我有这些 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;
}

!!笔记!!! EmployeeTwap之间没有关系

我创建了这个 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
..........

你知道有什么问题吗? 结果我总是得到 null 。 当我在 SQL 编辑器中运行此查询时,我得到了正确的结果表。

您正在尝试将 map 本机查询结果发送到非实体 class。 如果我没记错的话,结果列名应该匹配方法名。 您是否尝试过为这样的列设置别名?

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

您是否还阅读过此Spring 数据 JPA map 对非实体 POJO 的本机查询结果 它看起来与您的情况非常相似。

如果这没有帮助,看起来谷歌有很多关于如何做到这一点的结果本机查询结果在 dto

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM