Вы определенно можете сделать это с HQL; Я успешно проверил это.
var items = session.CreateQuery("SELECT i.Id FROM Item i JOIN i.Tags tags WHERE tags.Name IN(:tags) GROUP BY i HAVING COUNT(DISTINCT tags) = :tagCount")
.SetParameterList("tags", tagNames)
.SetInt32("tagCount", tagNames.Count)
.List();
Это даст вам список Item
идентификаторов, которые вы можете использовать для получения Item
s. Комбинация GROUP BY
и HAVING
может быть неэффективной на некоторых СУБД. Есть другой метод запроса, использующий итеративные объединения, которые могут быть более эффективными в определенных СУБД, но я не могу заставить его работать (возможно, вообще невозможно с Criteria). Если я когда-нибудь это сделаю, я обновлю свой ответ.