JPA 本机查询。无法选择特定列

问题描述 投票:0回答:2

我正在开发一个 Spring Boot 项目,使用 JPA 连接到我的数据库。我想进行本机查询来选择某些特定字段,但它不允许我这样做。例如,我只想获取客户的 id、名字、姓氏和电话号码,但这会引发错误,例如,

在此结果集中未找到列名 current_access_token。

这是我在 JPA 存储库中的查询代码,

@Query(value = "SELECT c.id, c.phone_number, c.firstname, c.lastname FROM tbl_customers c JOIN tbl_subscriptions s ON c.id = s.customer_id WHERE s.role = 'member' AND s.deleted_at IS NULL", nativeQuery = true) 
List<Customer> findMemberByRole(String role);

这是我的Cutomer.java

@Getter
@Setter
@Accessors(chain=true)
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Entity
@Table(name = "tbl_customers")
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(unique = true)
    private Long id;
    @Column(nullable = false, name = "phone_number")
    private String phoneNumber;
    private String firstname;
    private String lastname;
    @Column(name = "current_access_token")
    private String currentAccessToken;
    @Column(name = "consent_accepted")
    private Boolean consentAccepted;
    ...
    ...
}

如何避免或忽略不需要的列?非常感谢您的帮助。

spring spring-boot spring-data-jpa
2个回答
1
投票

如果您确实只想从客户表中返回 4 列,那么您要在此处使用的签名是

List<Object[]>
:

@Query(value = "SELECT c.id, c.phone_number, c.firstname, c.lastname FROM tbl_customers c JOIN tbl_subscriptions s ON c.id = s.customer_id WHERE s.role = 'member' AND s.deleted_at IS NULL", nativeQuery = true) 
List<Object[]> findMemberByRole(String role);

然后,在访问结果集时,您将使用类似以下内容:

List<Object[]> resultSet = findMemberByRole("admin");
for (Object[] rs : resultSet) {
    Long id = (Long) rs[0];
    String phoneNumber = (String) rs[1];
    String firstName = (String) rs[2];
    String lastName = (String) rs[3];
}

0
投票

我找到了一种无需

Object[]
即可完成此操作的方法。假设您有一个 JPA 实体 MyEntity ,其中 作为 id 和内容的路径很大,比如说一个很大的 json,我们不想查询。这是我们能做的


@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class MyEntity {

  @Id
  String path;
  String content;

}
@Query(value = "SELECT my.path, null as content FROM my_entity", nativeQuery = true)
Page<MyEntity> getPartialResults(Pageable pageable);
© www.soinside.com 2019 - 2024. All rights reserved.