【问题标题】:I want to select specific columns specified by user in Spring boot JPA and Angular 7我想在 Spring boot JPA 和 Angular 7 中选择用户指定的特定列
【发布时间】:2020-10-19 17:01:37
【问题描述】:

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

现在,假设我得到
来自 myview 表和过滤器的 first_name、last_name、pincode、imei 和 contact_no 从 UI 应用,例如 pincode 从 4220% 开始last_name 是“毛茸茸的”。
那么如何在 JPA 中创建查询。
注意:每个用户的列选择都会改变,相应的过滤器也会改变。

【问题讨论】:

标签: spring-boot hibernate jpa spring-data-jpa angular7


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-08-17
    • 2014-03-27
    • 2020-04-04
    • 1970-01-01
    • 2020-01-14
    • 2020-03-03
    • 1970-01-01
    相关资源
    最近更新 更多