我想 select 用户在 Spring 中指定的特定列引导 JPA 和 Angular 7

I want to select specific columns specified by user in Spring boot JPA and Angular 7

我在 spring boot 和 angular 7.
中有一个项目 数据以表格格式显示。
要显示所有数据,JPA 的 findAll() 方法很好,但现在的问题是我想使用 MyView + 过滤器,用户可以通过它 select 显示哪些列。此外,过滤器应仅应用于可见列。
这是我的主要实体

    @Entity
    @Table("user")
    @Getter
    @Setter
    public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private int id;
    
    @Column(name="first_name", nullable = false, length = 500)
    private String firstName;
    
    @Column(name="last_name", length = 2000)
    private String lastName;
    
    @Column(name="imei", length = 20)
    private String imei;

    @Column(name="address", length = 10)
    private String address;

    @Column(name="pincode", length = 10)
    private String pincode;
    
    @Column(name="latitude", length = 20)
    private String latitude;
    
    @Column(name="longitude", length = 20)
    private String longitude;
    
    @Column(name="contact_no", length = 10)
    private String contactNo;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="country_id", nullable = false)
    private Country country;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="state_id", nullable = false)
    private State state;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="city_id", nullable = false)
    private City city;

    @Column(name="is_active", columnDefinition = "tinyint(1) default 1", insertable = false)
    private Boolean isActive;
    
    @Column(name="created_on")
    @CreationTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdOn;
    
    public User() {
        
    }
}

这是 MyView 实体

@Entity
@Table("my_view")
@Getter
@Setter
public class MyView {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private int id;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="user_id", nullable = false)
    @JsonProperty( access = Access.WRITE_ONLY )
    private User user;  
    
    @Column(name="column_name", nullable = false, length = 500)
    private String columnName;
    
    @Column(name="visible", columnDefinition = "tinyint(1) default 1", insertable = false)
    private Boolean visible;
    
    public MyView() {
        
    }
}

现在,假设我得到
first_name、last_name、pincode、imei 和 contact_no 来自 myview table 和过滤器从 UI 应用,如 pincode 以 4220%[ 开头=33=] 和 last_name 是 'furry'.
那么如何在 JPA 中创建查询。
注意:列 selection 会因每个用户而改变,相应的过滤器也会改变。

对于动态过滤器,您可以在更高级的情况下使用 Query By Example in simple cases or Specifications

限制选择的列通常在 Spring Data JPA 中通过使用 projection interface 作为 return 值来完成。 但是动态地这样做是不可能的,无论哪种方式,你都不能将它与动态 where 子句的选项结合起来。

因此解决方案是 implement a custom method,注入 EntityManager,根据需要使用标准 API 或 JPQL 语句的字符串连接(不推荐,因为SQL 注射的风险)。