使用Spring Elasticsearch数据存储库构建查询

时间:2019-06-25 08:32:18

标签: java spring elasticsearch jpa repository

我正在使用Elasticsearch 6和Spring数据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:找不到类型为String的属性工具!遍历的路径:VehicleEventEL.id。

我找不到解决方法。

1 个答案:

答案 0 :(得分:1)

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

  

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

     

List<Person> findByAddress_ZipCode(ZipCode zipCode);

     

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

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