Вот простое решение с использованием SQL
SELECT parent_id
FROM child_parent
WHERE child_id IN ('childA', 'childC')
GROUP BY parent_id
HAVING COUNT(DISTINCT child_id) = 2
Если родитель не может иметь одного и того же потомка дважды (например, у вас есть уникальный ключ на (parent_id, child_id)
, то вы можете удалить DISTINCT
из COUNT()
] агрегатная функция.
Это должно быть просто, чтобы перевести это в JPQL, или вы просто используете собственный запрос SQL.
Несмотря на то, что я не знаю о картографе данных, который делает то, что вы хотите для EF, написать его не сложно. Кроме того, поскольку определение отображений является большей частью работы, на самом деле это не сложнее, чем использование отображений интерфейса, которые вы перечислили. Вы просто создаете класс Mapper, который имеет несколько функций карты, каждая из которых содержит вашу логику отображения.
Одной мыслью, которая может быть интересной, является создание методов расширения функций вашей карты. Вы по-прежнему создаете класс Mapper, но каждый из методов карты будет выглядеть как
public static Person MapToPerson(this Manager.Model.Customer bizObject)
{
Person person = new Person();
// mapping logic
return person;
}
Поскольку метод MapToPerson является методом расширения, а не методом в вашем классе bizObject, вы не нарушаете POCO. Но из-за синтаксического сахара метода расширения ваш метод InsertCustomer может иметь такой код:
Customer customer = bizObject.MapToCustomer();
Person person = bizObject.MapToPerson();