带有子元素的Spring CrudRepository查询?

时间:2016-08-04 05:07:56

标签: java spring-boot couchbase

我有像以下一样的沙发基础文件

{
  "contentTimestamp": 1470216079085,
  "version": 12,
  "content": [
    {
      "text": "ABC",
      "params": {
        "TYPE": "TEXT"
      }
    }
    ],
  "readers": {
    "u_id_1": 0,
    "u_id_2": 0,
  },
  "contributors": [
    {
      "id": "u_id_1"
    }
  ]
}

文档课

@Document
public class ContentDoc implements Serializable{

    private static final long serialVersionUID = 1L;


    @Id
    private String id;

    @Field
    private Integer version = 12;

    @Field
    private List<Content> content = new ArrayList<>();

    @Field
    private Map<String, Object> readers = new HashMap<>();

    //etc

    //getter setter

}

服务

@Service
public interface ContentDocRepository extends CrudRepository<ContentDoc, String> {

    public List<ContentDoc> findByReadersIn(String reader) throws Exception;

}

Testcase

@RunWith(SpringJUnit4ClassRunner.class)
public class Tests {

    @Autowired
    private ContentDocRepository contentDocRepository;

    @Test
    public void cotentDocRepoTest(){

        List<ContentDoc> contents = contentDocRepository.findByReadersIn("u_id_1");
        Assert.assertNotNull(contents);
        System.out.println(contents)
    }
}

我按照上面编写的代码但是无法检索结果总是空的arraylist。

任何人都知道我的代码出了什么问题,我怎样才能用子元素执行查询?

谢谢你的进步。

3 个答案:

答案 0 :(得分:1)

经过长时间的RND和实验,我得到了解决方案,

  

我们没有办法找到带有方法名称的子元素,所以我们需要   按照我的回答

步骤:

1)按照以下

在couchbase中创建自定义视图

viewname :findContentByUser

function (doc, meta) {

  if(doc._class == "package.model.ContentDoc") {
    for(var i=0; i < doc.contributors.length; i++){
         emit(doc.contributors[i].id, null);
    }

  }
}  

2)服务:使用impl方法绑定viewname和designDocument,如下所示

@Service
public interface ContentDocRepository extends CrudRepository<ContentDoc, String> {

    @View(viewName = "findContentByUser", designDocument="dev_content")
    public List<ContentDoc> findByContributors_id(String id) throws Exception;

}

终于得到了结果:)

答案 1 :(得分:1)

您不再需要创建视图,只需使用@ N1qlPrimaryIndexed和@ViewIndexed注释,它应该是开箱即用的:

@N1qlPrimaryIndexed
@ViewIndexed(designDoc = "building")
public interface BuildingRepository extends 
CouchbasePagingAndSortingRepository<Building, String> {

    List<Building> findByCompanyId(String companyId);

}

我在这里回答了一个非常相似的问题Using IN clause in couchbase N1Ql @query or use findAll(keys) from couchbase JPA

你可以在这里关注我的教程: https://blog.couchbase.com/couchbase-spring-boot-spring-data/

答案 2 :(得分:0)

@Service
public interface ContentDocRepository extends CrudRepository<ContentDoc, String> {

    @View(viewName = "findContentByUser", designDocument="dev_content")
    public List<ContentDoc> findByContributors_id(String id) throws Exception;

}