1

我有

@Document
public class Employee
{
 @Id
 Long empCode;
 String empSurname;
 String address;
// getters setters
}

我已经使用 Mongo Repositories 编写了一个查询,例如

public interface EmployeeRepository extends MongoRepository<Employee, Long>
{

List<Employee> findEmployeesByEmpCode(int empCode);

@Query(value="{ 'empCode' : ?0 }", fields="{ 'address' : 1}")
List<String> findAddressByEmpCode(int empCode);

第一个查询有效,但第二个查询失败。仅当我将返回的 List 类型更改为 Employee 时它才有效。

失败时的错误是

java.lang.IllegalArgumentException: [Assertion failed] - this argument is required; it must not be null
    at org.springframework.util.Assert.notNull(Assert.java:115)
    at org.springframework.util.Assert.notNull(Assert.java:126)
    at org.springframework.data.convert.EntityInstantiators.getInstantiatorFor(EntityInstantiators.java:86)
    at org.springframework.data.mongodb.repository.query.DtoInstantiatingConverter.<init>(DtoInstantiatingConverter.java:61)
    at org.springframework.data.mongodb.repository.query.MongoQueryExecution$ResultProcessingConverter.convert(MongoQueryExecution.java:376)
    at org.springframework.data.mongodb.repository.query.MongoQueryExecution$ResultProcessingExecution.execute(MongoQueryExecution.java:345)
    at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.execute(AbstractMongoQuery.java:91)

显然,它无法解决如何将包含的 Employee 对象中的值转换为 String。我该如何实现呢?任何例子将不胜感激。

谢谢,

4

1 回答 1

1

fields属性用于过滤未设置到您的域对象 ( Employee) 中的属性。跟MongoDB的投影机制关系不大。

要在此处使用投影,请参阅参考文档中的投影

您将必须创建一个投影界面:

interface AddressesProjection { String getAddress(); }

并相应地更改存储库方法签名:

List<AddressesProjection> findByEmpCode(int empCode);

投影声明了基础类型和与公开属性相关的方法签名之间的契约。因此需要根据底层类型的属性名称来命名 getter 方法。

这是你能得到的最接近的,afaik。

于 2016-05-05T12:19:32.843 回答