问题描述
我在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注入的风险,因此不建议使用)