在Spring MongoDB查询中指定单个字段投影

5

我有一个查询,它能够正确地返回我的实体(Prl)的一个属性:

@Query("{'recibido' : null ,'activo' : true}")
public List<EmpleadoIdDTO> findIdsEmpleadosPrlActivoRecibidoIsNull();

类:

public class EmpleadoIdDTO {
private Long empleadoId;

 public Long getEmpleadoId() {
   return empleadoId;
 }

public void setEmpleadoId(Long empleadoId) {
this.empleadoId = empleadoId;
 } 
}

我需要将此查询传递给Criteria,因为它会不断增长。
import java.util.ArrayList;
import java.util.List;

import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.query.BasicQuery;
import org.springframework.data.mongodb.core.query.Criteria;

import com.xxx.crm482.domain.Prl;
import com.xxxx.crm482.service.dto.FilterPrlDTO;

public class PrlRepositoryImpl implements PrlRepositoryCustom {


private final MongoOperations mongoOperations;

public PrlRepositoryImpl(MongoOperations mongoOperations) {
this.mongoOperations = mongoOperations;
}


@Override
public List<Prl> find(FilterPrlDTO filterPrlDTO) {
List<Criteria> andCriteria = new ArrayList<>();

andCriteria.add(Criteria.where("activo").is(true));
andCriteria.add(Criteria.where("recibido").is(null));
Criteria orCriteria = new Criteria().andOperator(andCriteria.toArray(new Criteria[andCriteria.size()]));
Document projection = new Document("empleadoId", 1);
return mongoOperations.find(new BasicQuery(orCriteria.getCriteriaObject(), projection), Prl.class);
}
}

在这里,我需要您返回实体“Prl”中的属性“empleadoId”,而不是返回整个实体。

2个回答

5
您可以通过链接查询条件来简化方法。将字段投影添加到Query类中。
将流添加到映射您投影的字段。
@Override
public List<Long> find(FilterPrlDTO filterPrlDTO) {
   Criteria criteria = Criteria.where("activo").is(true).and("recibido").is(null);
   Query query = new Query(criteria);
   query.fields().include("empleadoId");
   List<String> empleadoIds = mongoOperations.find(query, Prl.class).stream().map(Prl::getEmpleadoId).collect(Collectors.toList());
   return empleadoIds;
}

0

几件事情。无法仅获取一个属性。但是,您可以只使用一个属性(所有其他字段将为空)获取Pr1对象。 您可以使用投影来实现这一点。

andCriteria.add(Criteria.where("activo").is(true));
andCriteria.add(Criteria.where("recibido").is(null));
Criteria orCriteria = new Criteria().andOperator(andCriteria.toArray(new Criteria[andCriteria.size()]));
Document projection = new Document("empleadoId", 1);

return mongoOperations.find(new BasicQuery(orCriteria.getCriteriaObject(), projection), Prl.class);

无法实例化类型Document:"new Document("empleadoId", 1);" - Jose
"new BasicQuery(orCriteria.getCriteriaObject(), projection), Prl.class" <--- 构造函数BasicQuery(DBObject, Document)未定义。我已按照您的指示更新了问题,以便您可以准确地看到代码,包括输入。" - Jose
文档类型为 org.bson.Document,请确保您使用了正确的类型。 - pvpkiran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接