Коллекции INNER JOIN в Spring Data MongoDBJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Коллекции INNER JOIN в Spring Data MongoDB

Сообщение Anonymous »

Как реализовать INNER JOIN в Spring Mongo?

Дурацкий пример, на самом деле он неверен, я просто хочу показать отношение многие-ко-многим:

Код: Выделить всё

@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
, PetCustomRepository {

}

public interface PetCustomRepository {

List findAllByPetTypeAndPersonName(PetType type, String personName, Pageable pageable);

}

public class PetCustomRepositoryImpl implements PetCustomRepository {

@Autowired
private MongoTemplate mongoTemplate;

@Override
public List 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() возвращает пустой список. Что я делаю не так?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»