我有一个实体类,它有3个枚举字段。现在,我想编写一个规范类来过滤基于这些枚举字段的记录。我知道我可以为每个枚举类编写一个谓词。然而,我想知道我是否可以编写任何泛型类来过滤任何枚举。这将节省代码和维护工作。
下面是我的实体类。
@Entity
@Table(name = "customer_lead")
@Where(clause = ReusableFields.SOFT_DELETED_CLAUSE)
@Audited(withModifiedFlag = true)
@Data
public class Lead extends ReusableFields implements Serializable
{
public Lead() {
// TODO Auto-generated constructor stub
}
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "lead_id", updatable = false, nullable = false)
Long leadId;
@Column(name="name")
String customerName;
@Column(name="primary_mobile")
String primaryMobile;
@Column(name="secondary_mobile")
String secondaryMobile;
@Column(name="email_id")
String emailId;
@Column(name="purpose")
String purpose;
@Column(nullable=true)
@Enumerated(EnumType.STRING)
PropertyTypeEnum propertyType;
@Column
@Enumerated(EnumType.STRING)
SentimentEnum sentiment;
@NonNull
@Column(name="status",nullable=false)
@Enumerated(EnumType.STRING)
LeadStatusEnum status;
}
是。这是可以做到的。步骤
- 用两个方法创建一个规范生成器类。一个用于基于枚举类获取枚举值。第二个是根据上一个方法返回的枚举值筛选枚举
@Component
public class SpecificationsBuilder<T>
{
public Specification<T> whereEnumFieldEquals(String key, List<String> names, Class claz)
{
Specification<T> finalSpec = null;
for (String name : names)
{
@SuppressWarnings("unchecked")
Specification<T> internalSpec = (Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) -> cb
.equal(root.get(key), getEnum(name, claz));
finalSpec = specOrCondition(finalSpec, internalSpec);
}
return finalSpec;
}
public static <E extends Enum<E>> E getEnum(String text, Class<E> klass)
{
return Enum.valueOf(klass, text);
}
}
- 在你的主课堂上。创建一个类型为lead的规范生成器实例,并通过传递enum.class作为参数来调用这些方法。下面的示例代码。(请注意,这只是一个示例(
static SpecificationsBuilder<Lead> specbldr = new SpecificationsBuilder<Lead>();
specbldr.whereEnumFieldEquals(Lead_.SENTIMENT, sentiment, SentimentEnum.class));