Как реализовать INNER JOIN в Spring Mon go?
Глупый пример, например, на самом деле он некорректен, я просто хочу показать много-к-одному многие отношение:
@Document(collection = "people")
public class Person {
@Id
private String id;
private String name;
private String petId;
// Getters, setters, constructors and etc.
}
@Document(collection = "pets")
public class Pet {
@Id
private String id;
private String name;
private PetType petType; // Dog, Cat etc.
// Getters, setters, constructors and etc.
}
Если я хочу найти всех собак, принадлежащих Джону Смиту, как мне это сделать? Мне нужен такой запрос:
SELECT
pt.*
FROM
pets AS pt INNER JOIN people AS pe ON (pt.id = pe.petId)
WHERE
pt.petType = ${input_petType}
AND pe.name = ${input_name}
Это означает, что у меня есть два условия в коллекции Pet
и коллекции Person
:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.LookupOperation;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import java.util.List;
public interface PetRepository extends MongoRepository<Pet, String>, PetCustomRepository {
}
public interface PetCustomRepository {
List<Pet> findAllByPetTypeAndPersonName(PetType type, String personName, Pageable pageable);
}
public class PetCustomRepositoryImpl implements PetCustomRepository {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public List<Pet> findAllByPetTypeAndPersonName(PetType petType, String personName, Pageable pageable) {
LookupOperation lookup = LookupOperation.newLookup()
.from("people")
.localField("_id")
.foreignField("petId")
.as("join_people");
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(Criteria.where("petType").is(petType)),
lookup,
Aggregation.match(Criteria.where("join_people.name").is(personName)),
Aggregation.skip(pageable.getPageNumber() * pageable.getPageSize()),
Aggregation.limit(pageable.getPageSize()));
return mongoTemplate.aggregate(aggregation, Pet.class, Pet.class).getMappedResults();
}
}
findAllByPetTypeAndPersonName()
метод возвращает пустой список. Что я делаю не так?