首页 > 解决方案 > 使用 Spring Elasticsearch 数据存储库构建查询

问题描述

我正在使用 elasticsearch 6 和 Spring data jpa 进行查询。我写了这段代码:

  1. 持久对象:
@Document(indexName="vehicle_event", type="vehicle_event")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class VehicleEventEL {

    @Id
    private String id;
    private Long id_vehicle;
    private Long id_road;
    private Float latitude;
    private Float longitude;
    private String name_road;
    private Date timestamp;

}
  1. 存储库:
@Component
public interface VehicleEventELRepository extends ElasticsearchRepository<VehicleEventEL, String> {

    Page<VehicleEventEL> findByTimestampBetween(String startTime, String endTime, Pageable page);

    Page<VehicleEventEL> findByTimestampBetweenAndId_vehicleEquals(String startTime, String endTime, Long id_vehicle, Pageable page);
}

该方法findByTimestampBetween有效。

该方法findByTimestampBetweenAndId_vehicleEquals不起作用,并给我以下错误:

创建名为“vehicleEventELRepository”的 bean 时出错:调用 init 方法失败;嵌套异常是 org.springframework.data.mapping.PropertyReferenceException: No property vehicle found for type String!遍历路径:VehicleEventEL.id。

我找不到解决方案。

标签: javaspringelasticsearchjparepository

解决方案


下划线是一个问题,解决方案是遵循 java 命名约定。 Spring文档说:

要解决这种歧义,您可以在方法名称中使用 _ 来手动定义遍历点。所以我们的方法名称如下:

List<Person> findByAddress_ZipCode(ZipCode zipCode);

因为我们将下划线字符视为保留字符,我们强烈建议遵循标准的 Java 命名约定(即,不在属性名称中使用下划线,而是使用驼峰式大小写)。

如果您无法更改名称,则选项之一是使用 @Query 注释。


推荐阅读