使用' findBy'在Spring Data Couchbase中构建`_class`在哪里?方法?

时间:2017-03-06 22:26:06

标签: spring spring-data-jpa spring-data-couchbase

我可以扩展/覆盖Spring Data中的哪些类以使where子句包含继承基本实体/模型的类?

详细说明......

以下是一些从" base"延伸的模型。活动类:

@Document
public abstract class Activity {
}

@Document
public class CommentActivity extends Activity {
}

@Document
public class ShareActivity extends Activity {
}

保存这些模型时,我使用单个存储库类定义如下,并使用" findBy"方法:

@Repository("activityRepository")
public interface Activity extends CouchbaseRepository<Activity, String>, CouchbaseRepositoryCustom<Activity, String> {

    Page<Activity> findByPersonId(String personId, Pageable pageable);

}

// saving a model in my application would be like so
activityRepository.save(new CommentActivity());

从Couchbase中检索回来时,结构返回如下:

{
    "_CAS": 123234342354345,
    "_ID": "0001",
    "_class": "com.myproject.models.CommentActivity",
    "comment": "yo",
    "dateCreated": 1400000000000,
    "dateUpdated": 1400000000000,
    "personId": "0001"    
}

该项目使用的是Spring Data Couchbase 2.2.0.RELEASE。基于上面的Repository Interface,调用findByPersonId方法将自动生成一个只包含where子句中的基类的查询。

WHERE (`personId` = "0001") AND `_class` = "com.myproject.models.Activity" 

在我的情况下,我想包括从Activity扩展的所有类型:

   WHERE 
          (`_class` = "com.myproject.models.Activity" 
             OR `_class` = "com.myproject.models.UpdatedActivity" 
             OR `_class` = "com.myproject.models.StatusChangedActivity") 
   AND personId = "0001"

1 个答案:

答案 0 :(得分:0)

您可以定义自己的查询字符串,例如

@Query("#{#n1ql.selectEntity} WHERE personId = ${'$'}personId AND (_class='com.myproject.models.UpdatedActivity' OR _class='com.myproject.models.StatusChangedActivity'")
fun findByPersonId(@Param("personId") personId: String): List<Activity>

上面的代码在Kotlin中,但是我想很容易适应Java。

请注意,我必须向存储库类添加@N1qlPrimaryIndexed