spring-data-cassandra和spring-data-solr之间的冲突

时间:2018-05-09 07:30:47

标签: solr cassandra spring-data spring-data-cassandra spring-data-solr

我目前正在从事需要Cassandra数据库才具备搜索能力的项目。我们有DataStax集群,我们希望使用Spring Data来简化数据库操作。但是,当我们制作同时获得两者的实体 - @Table(对于cassandra)和@SolrDocument(对于Solr)时,它恰好被打破了。我们得到的唯一错误是下面的错误。有人遇到过这样的问题吗?

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property findAll found for type ENTITYNAME!

我知道这可能是春天的问题,但希望能找到一个打过这类问题的人。 问候!

导致问题的一些示例实体:

@SolrDocument(solrCoreName = "sample_entity")
@Table("sample_entity")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public final class SampleEntity {

    @PrimaryKey
    @Indexed(name = "id")
    private UUID id;

    private LocalDateTime created;

    private UUID foreignId;

    @Indexed(name = "name")
    private String name;

    private boolean someflag = true;
}

1 个答案:

答案 0 :(得分:1)

您正在混淆事情 - 如果您正在使用DSE搜索,那么通过查询solr_query列,通过CQL执行搜索会更好。在您的示例中,@SolrDocument将强制使用Solr的HTTP API,而@Table将强制使用CQL。

您可以使用DataStax中的Object Mapper将类映射到表,如下所示:

// STest.java
@Table(keyspace = "test",name = "stest")
  public class STest {
    @PartitionKey
    private int id;
    private String t;
}

// STestAccessor.java
@Accessor
public interface STestAccessor {
    @Query("SELECT * FROM test.stest WHERE solr_query = :solr")

    Result<STest> getViaSolr(@Param("solr") String solr);
}

// STestMain.java
MappingManager manager = new MappingManager(session);

STestAccessor sa = manager.createAccessor(STestAccessor.class);
Result<STest> rs = sa.getViaSolr("*:*");

for (STest sTest : rs) {
    System.out.println("id=" + sTest.getId() + ", text=" + sTest.getT());
}

Here is the full code