Есть таблица users & words связь многие ко многим. И связующая таблица, ну например users_words(неожиданно, да?)
Как можно проделать при помощи Criteria такую выборку:
select *
from words
left join users_words on users_words.word_id = words.id
where users_words.user_id = {id} or
users_words.id is null'
Как я понимаю hibernate связывает через inner join но мне нужен left.
public class Group implements DomainModel{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
...
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
@JoinTable(name = "user_groups", joinColumns = {
@JoinColumn(name = "group_id") },
inverseJoinColumns = { @JoinColumn(name = "user_id") })
private Set<User> users = new HashSet<User>(0);
}
public class User implements DomainModel{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
...
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "users")
private Set<Group> groups = new HashSet<Group>(0);
}
{
Criteria criteria = session.createCriteria(Group.class);
criteria.setFetchMode("users", FetchMode.JOIN);
criteria.createAlias("users","usersAlias");
criteria.add(Restrictions.isNull("users.id"));
}
Как-то так:
List<Group> groups = session.createCriteria(Group.class, "g")
.createAlias("users", "u", JoinType.LEFT_OUTER_JOIN)
.add(
Restrictions.or(
Restrictions.eq("u.id", 1L),
Restrictions.and(
Restrictions.isEmpty("g.users"),
Restrictions.isEmpty("u.groups")
)
)
)
.list();
Выбирает все группы, в которые никто не входит и которые никто не включает, а также группу, в которую входит пользователь с ID = 1.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости