标准规范-如何编写通用类以通过实体的任何枚举字段过滤实体

bsp753

我有一个具有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; 
}
斯里达·帕特奈克(Sridhar Patnaik)

是。可以做到的。脚步

  1. 使用两种方法创建规范构建器类。一种基于枚举类获取枚举值的方法。第二个过滤器根据先前方法返回的枚举值过滤枚举。
@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);
    }
}
  1. 在你的主要班级。创建一个类型为lead的规范生成器实例,并通过将enum.class作为参数来调用方法。下面的示例代码。(请注意,这只是一个示例)
static SpecificationsBuilder<Lead> specbldr = new SpecificationsBuilder<Lead>();

specbldr.whereEnumFieldEquals(Lead_.SENTIMENT, sentiment, SentimentEnum.class));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

std :: span默认构造函数上的当前标准规范是否在“范围<= 0”上正确?

我们所说的“文档重排”是什么意思,并且我们有重排文档的标准规范吗?

如何为多个实体编写单个jpa规范

如何对多个实体使用单个JPA规范类和方法

如何编写通用实例的规范?

休眠/空间的规范/谓词,以过滤实体是否在半径内

规范中可以使用非实体字段吗?

如何使通用类对多个实体使用JPARepository

对于没有返回类型的函数,标准是否有任何规范性用语?

如何通过通用搜索获取实体列表

JPA标准按相关实体过滤,无需连接

如何根据提供的规范编写 css 类?

C11:定长数组声明如何符合C11标准的规范?

如何规范 Win10 MBR 分区以迁移到 GPT 和标准 EFI

如何规范 Win10 MBR 分区以迁移到 GPT 和标准 EFI

从列表实体获取规范形式

通过片段标识符或视图规范嵌入HTML的外部SVG文档的非标准视图:如何操作viewBox?

如何在实体框架和Mysql中使用规范函数

如何在具有枚举字段的实体上使用JPA CriteriaQuery填充DTO类字符串字段?

类对象的通用类型规范

您被迫遵循的最奇怪的编码标准规则是什么?

单页应用程序的Azure CDN Microsoft标准规则引擎重写URL

如何在基础实体中定义通用主键字段?

如何编写采用通用C ++标准库容器的模板函数

实体框架,以任何实体作为参数的方法(如何使代码更通用)

Spring JPA规范,用于过滤与子实体的一对多关系

如何为嵌套实体构建 Hibernate 标准

JPA标准:将根向下转换为多个实体子类,并按相同的链接实体自然ID进行过滤

(Odoo) 如何过滤保存在模型字段中的行/实体?