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

带有本机查询和数据投影的Spring JPA将错误的列映射到投影接口中

夹谷沛
2023-03-14

我有一个奇怪的问题,我不知道为什么会发生。我肯定我做错了什么,因为这是我第一次使用数据投影,而且我在使用DTOS时从来没有遇到过这样的问题。

我有一个SELECT statemen,它返回各种数据类型的某些列。我有一个接口,我将它传递给JPA存储库,这样它就可以进行接口映射。但是它不是根据列名映射结果(例如'accountnum'->getAccountNumber()),而是按照字母顺序映射列。因此,如果'date_of_order'是SELECT语句中的第一个,它的值将由getAccountNumber()返回。

public interface FlatSearchResult {
    String getAccountnumber();
    UUID getTrackingId;
    Date getDateOfOrder;
}
ACCOUNT
  - account_id : uuid (pkey)
  - accountnumber : string
ORDERS
  - order_id : uuid (pkey)
  - date_of_order : timestamp
  - account_id : uuid (fkey)
TRACKING
  - tracking_id : uuid (pkey)
  - order_id : uuid (fkey)

我用一个简单的查询定义了一个存储库:

public interface OrderTrackingRepository extends JpaRepository<Account, UUID> {
  @Query( nativeQuery = true,
          value = "SELECT o.date_of_order, a.accountnumber, t.tracking_id " +
                  "FROM account as a " +
                  "INNER JOIN orders as o USING (account_id) " +
                  "INNER JOIN tracking as t USING (tracking_id) " +
                  "WHERE a.accountnumber = :acctnum")
  <T> Collection<T> findOrderInfoForAccount(@Param("acctnum") acctNumber, Class<T> type);
}

当我调用此方法时,查询将返回正确的行。但是,它不是使用列名映射(例如,date_of_order到getDateOforder()),而是基于SELECT语句中列的顺序映射到接口中按字母顺序排列的方法。

所以:

SELECT date_of_order, accountnumber, tracking_id
getAccountNumber() -> date_of_order
getDateOfOrder() -> accountnumber
getTrackingId() -> tracking_id

我的数据库是Postgres。我使用的是Spring5.0.2.Release和Spring-Boot 2.0.0.M7。如果需要,我可以调整它们中的任何一个到更新的版本,但没有更老的。我使用C3P00.9.5.2进行连接池,并使用Postgres-9.2-1002.jdbc4。我的所有其他依赖项(hibernate等)都是这个版本的spring-boot所引入的。

共有1个答案

饶明亮
2023-03-14

不确定这是否是正确的解决方案,因为它只适合80%的描述。但它太长了,不能发表评论。我们开始了。

我想你误解了@osamayaccoub或文档。你的财产名称很好。但是select中的列应该符合java约定。

所以解决这个问题的第一个尝试是

value = "SELECT o.date_of_order as dateOfOrder, a.accountnumber as accountNumber, t.tracking_id as trackingId "
value = "SELECT o.date_of_order as \"dateOfOrder\", a.accountnumber as \"accountNumber\", t.tracking_id as \"trackingId\" "

我不明白的部分是,为什么使用列顺序分配东西。

 类似资料: