我想选择用户在Spring Boot JPA和Angular 7中指定的特定列

问题描述

我在Spring Boot和Angular 7中有一个项目。
数据以表格格式显示
显示JPA的所有数据 findAll()方法是好的,但是现在的问题是我想使用MyView +过滤器,用户可以通过该过滤器选择要显示的列。此外,过滤器应仅应用于可见列。
这是我的主要目的

    @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",length = 500)
    private String columnName;
    
    @Column(name="visible",insertable = false)
    private Boolean visible;
    
    public MyView() {
        
    }
}

现在,假设我得到了
myview表和过滤器中的first_name,last_name,pincode,imei和contact_no是从用户界面应用的,例如 pincode以4220%开头,而 last_name为'furry'。
那么我该如何在JPA中创建查询
注意:每个用户的列选择都会更改,相应的过滤器也会更改。

解决方法

对于动态过滤器,您可以在简单情况下使用Query By Example,在更高级情况下使用Specifications

通常在Spring Data JPA中通过使用projection interface作为返回值来限制所选列。 但是动态地做到这一点是不可能的,而且无论哪种方式,您都无法将其与动态where子句的选项结合使用。

因此解决方案是implement a custom method,注入EntityManager,并根据需要使用JPQL语句的Criteria API或String串联构造查询(由于存在SQL注入的风险,因此不建议使用)