spring-data-jpa 我如何可以得到一个搜索的所有字段在实体Spring Data Jpa

roqulrg3  于 2022-11-10  发布在  Spring
关注(0)|答案(2)|浏览(295)

我有一个实体传感器。我如何通过所有字段(包括类型和单位)进行搜索,因为现在我只通过(ID,名称,型号,...,位置,描述)得到结果。我使用Spring Data Jpa

@Query("SELECT s " +
            "FROM Sensor s " +
            "WHERE CONCAT(s.name, s.model, s.rangeFrom, s.rangeTo, s.location, s.description, 
             s.type, s.unit) " +
            "LIKE %:text%")
    List<Sensor> findAllSensorsByText(@Param("text") String text);

传感器类别

@Entity
@Table(name = "sensors")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Sensor {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "sensor_id")
    private Integer id;
    private String name;
    private String model;
    @Column(name = "range_from")
    private Integer rangeFrom;
    @Column(name = "range_to")
    private Integer rangeTo;
    private String location;
    private String description;
    @ManyToOne
    @JoinColumn(name = "type_id")
    private Type type;
    @ManyToOne
    @JoinColumn(name = "unit_id")
    private Unit unit;
}

类型类别

@Entity
@Table(name = "types")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Type {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "type_id")
    private Integer id;
    private String type;
}

单位类别

@Entity
@Table(name = "units")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Unit {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "unit_id")
    private Integer id;
    private String unit;
}
nkkqxpd9

nkkqxpd91#

首先,你不应该只是连接字段。如果一个字段包含"abc",下一个包含"def",你实际上会找到"bcde"的匹配,尽管你不应该这样做。
请改为使用or
对于TypeUnit,您可以使用JPQL简单地导航关系:

SELECT s 
FROM Sensor s 
WHERE 
s.name LIKE %:text%
OR s.model LIKE %:text%
OR s.rangeFrom LIKE %:text%
OR s.rangeTo LIKE %:text%
OR s.location LIKE %:text%
OR s.description LIKE %:text%
OR s.type.type LIKE %:text%
OR s.unit.unit LIKE %:text%

根据您的具体要求,在某些情况下,您可以切换到=而不是LIKE,这样就可以使用索引。

wvmv3b1j

wvmv3b1j2#

您可以尝试在CONCAT语句中使用s.*来获取所有字段,但它仅适用于本机查询。

@Query(value = "SELECT s.* FROM Sensor s WHERE CONCAT(s.*) LIKE %:text%" , nativeQuery = true)
List<Sensor> findAllSensorsByText(@Param("text") String text);

相关问题