java - 对单表的日期、整数和字符串数据类型字段执行多列搜索?

标签 java spring-data-jpa jpa-2.2

我正在工作Spring Data - Multi-column searchesSpring Data Jpa - The type Specifications<T> is deprecated我想搜索多列,例如 Date (Java 8 LocalDateTimeInstantLocalDate 等) 、IntegerString 数据类型。

但根据我的代码,仅考虑 String 字段(根据 where 子句中的日志)::

select
    employee0_.employee_id as employee1_0_,
    employee0_.birth_date as birth_da2_0_,
    employee0_.email_id as email_id3_0_,
    employee0_.first_name as first_na4_0_,
    employee0_.last_name as last_nam5_0_,
    employee0_.project_association as project_6_0_,
    employee0_.status as status7_0_ 
from
    employee employee0_ 
where
    employee0_.first_name like ? 
    or employee0_.email_id like ? 
    or employee0_.status like ? 
    or employee0_.last_name like ?

下面是我开发的代码。

Employee.java

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class Employee implements Serializable{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="EMPLOYEE_ID")
    private Long employeeId;

    @Column(name="FIRST_NAME")
    private String firstName;

    @Column(name="LAST_NAME")
    private String lastName;

    @Column(name="EMAIL_ID")
    private String email;

    @Column(name="STATUS")
    private String status;

    @Column(name="BIRTH_DATE")
    private LocalDate birthDate;

    @Column(name="PROJECT_ASSOCIATION")
    private Integer projectAssociation;
}

注意:用户可以使用全局搜索来搜索任何值,并且无论用户搜索什么,都应该能够看到数据,无论数据类型如何。

EmployeeSpecification.java

public class EmployeeSpecification {

    public static Specification<Employee> textInAllColumns(String text, List<String> attributes) {
        if (!text.contains("%")) {
            text = "%" + text + "%";
        }
        final String finalText = text;

        return (root, query, builder) -> builder
                .or(root.getModel().getDeclaredSingularAttributes().stream().filter(a -> {
                    if (a.getJavaType().getSimpleName().equalsIgnoreCase("String")) {
                        return true;
                    }else if(a.getJavaType().getSimpleName().equalsIgnoreCase("date")) {
                        return true;
                    }
                    else {
                        return false;
                    }
                }).map(a -> builder.like(root.get(a.getName()), finalText)).toArray(Predicate[]::new));
    }
}

但是这种方法只考虑字符串字段,而不考虑日期和整数数据类型。我们怎样才能做到这一点?

最佳答案

更改:

if(a.getJavaType().getSimpleName().equalsIgnoreCase("date")) 

至:

if(a.getJavaType().getSimpleName().equalsIgnoreCase("LocalDate"))

关于java - 对单表的日期、整数和字符串数据类型字段执行多列搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57134279/

相关文章:

java - 在 tomcat servlet 中检测客户端断开连接?

java - 如何在使用 Java 读取和处理数据库记录时进行异步消息传递

Java:Chronicle Map 是否支持不同的值类别?

java - Spring Data JPA - 为三个表创建 @Composite 键

java - EclipseLink 2.7.0 和 JPA API 2.2.0 - 签名不匹配

java - 在 Java 中对随机数组进行排序

java - 默认的@Transactional在底层是如何工作的?

java - Spring Data Jpa展示

java - 在 Spring Boot 中连接多个 "Dynamic"数据库以及本地 "Static"数据库

java - 在 JPA-SQL(或 HQL)查询中兼容的 Hibernate Composite UserType