Spring Data Cassandra:如何使用复合键查询表?

csc*_*can 4 java spring cassandra spring-data spring-data-cassandra

我有以下列族:

@Table(value = "request_event")
public class RequestEvent {

    @PrimaryKeyColumn(name = "day_requested", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
    private LocalDate dayRequested;

    @PrimaryKeyColumn(name = "date_requested", ordinal = 1, type = PrimaryKeyType.CLUSTERED, ordering = Ordering.DESCENDING)
    private LocalDateTime dateRequested;

    ...
}
Run Code Online (Sandbox Code Playgroud)

由存储库存储和访问:

@Repository
public interface RequestEventRepository extends CrudRepository<RequestEvent, LocalDateTime> {
}
Run Code Online (Sandbox Code Playgroud)

不幸的requestEventRepository.findOne(localDate)是抛出异常,可能是因为它返回了多个结果.我怎样才能解决这个问题?此外,如何检索特定日期的所有结果?

mp9*_*1de 9

您有两个选项来表示Spring Data Cassandra的复合键:

  1. 使用@PrimaryKeyColumn域类型中(像你这样).
  2. 使用a @PrimaryKeyClass表示主键并将其嵌入域类型中.

Spring Data存储库接受单一ID类型.因此,不可能只声明LocalDateTime为id.如果您想坚持@PrimaryKeyColumn使用域类型,请使用MapIdid类型:

@Table(value = "request_event")
public class RequestEvent {

    @PrimaryKeyColumn(name = "day_requested", ordinal = 0,
            type = PrimaryKeyType.PARTITIONED) 
    private LocalDate dayRequested;

    @PrimaryKeyColumn(name = "date_requested", ordinal = 1, type = PrimaryKeyType.CLUSTERED,
            ordering = Ordering.DESCENDING) 
    private LocalDateTime dateRequested;

}

public interface RequestEventRepository extends CrudRepository<RequestEvent, MapId> {}

MapId mapId = BasicMapId.id("dayRequested", …).with("dateRequested", …);

RequestEvent loaded = eventRepository.findOne(mapId);
Run Code Online (Sandbox Code Playgroud)

如果您决定将主键表示为值对象,则需要稍微调整域类型:

@PrimaryKeyClass
public class Key implements Serializable {

    @PrimaryKeyColumn(name = "day_requested", ordinal = 0,
            type = PrimaryKeyType.PARTITIONED) 
    private LocalDate dayRequested;

    @PrimaryKeyColumn(name = "date_requested", ordinal = 1, type = PrimaryKeyType.CLUSTERED,
            ordering = Ordering.DESCENDING) 
    private LocalDateTime dateRequested;

}

@Table(value = "request_event")
public class RequestEvent {

    @PrimaryKey 
    private Key key;

}

public interface RequestEventRepository extends CrudRepository<RequestEvent, Key> {}

eventRepository.findOne(new Key(…))
Run Code Online (Sandbox Code Playgroud)

  • 您需要在查询方法名称中包括属性路径。对于上面的示例,它是`findAllByKeyDayRequested(…)`。 (2认同)