Предоставлено 2 таблицыHibernate Критерии - Присоединение на ип отображенный объект
@Entity
@Table
public class SomeEntity {
@Id
private Long someId;
@Column
private String text;
@ManyToMany
@JoinTable(name = "map", joinColumns = @JoinColumn(name = "someId"), inverseJoinColumns = @JoinColumn(name = "eventId"))
private Set<SomeEntityEvent> events;
// get/set
}
и
@Entity
@Table
public class SomeEntityEvent {
@Id
private Long eventId;
@Column
private Calendar date;
// get/set
}
Hibernate будет генерировать следующие таблицы (уведомление я не объект для карты)
some_entity: someId | text some_entity_event: eventId | date map: someId | eventId
Я хочу использовать API Criteria
, чтобы получить все экземпляры SomeEntityEvent
, принадлежащие определенному SomeEntity
, упорядоченным по дате и в определенном диапазоне. С SQL, я мог бы просто сделать
SELECT *
FROM some_entity_event e
NATURAL JOIN map
WHERE map.someId = [ my field ]
ORDER BY e.date DESC
LIMIT 0, 100;
Поскольку у меня нет Map
сущности (или ссылка на SomeEntity
), я не знаю, как построить Criteria
, что эквивалентно вышеупомянутый запрос. Критерии ниже меня все SomeEntityEvent
. Я хочу только те, которые принадлежат некоторым SomeEntity
.
Criteria criteria = getCurrentSession().createCriteria(SomeEntityEvent.class);
criteria.addOrder(Order.desc("date"))
.setFirstResult(firstResult)
.setMaxResults(maxResults);
return criteria.list();
Возможно ли это с Criteria
? Если да, как вы выполняете это соединение?
Я думаю, что я собираюсь добавить двунаправленную связь. Я не изначально, потому что я не хотел, чтобы пользователи могли следить за этой ассоциацией. Я смотрел на другие вопросы, на которых вы даете тот же ответ, за исключением того, что в конце вы устанавливаете 'ResultTransformer'' DistinctRootEntityResultTransformer.INSTANCE'. Что это значит? –
Кроме того, в первом варианте HQL выполняется ли объединение, как «естественное соединение», только отображение равных идентификаторов? –
В результате он не может иметь одно и то же событие. Это в основном идентично наличию 'select distinct' в HQL. Возможно, вам это действительно понадобится. Забыл об этом. –