Hibernate Fetch больше не является подтипом Join - PullRequest
0 голосов
/ 02 октября 2018

Я использую Hibernate 5.2.10 с динамическими критериями и выясняю, что Fetch больше не назначается для Join.

В следующем примере мне нужно получить групповые данные в том же запросе, но мне также нужно использовать поле группы для сортировки или ограничения.

CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<GroupAssignment> query = cb.createQuery(GroupAssignment.class);

Root<GroupAssignment> root = query.from(GroupAssignment.class);
SingularAttributeJoin<GroupAssignment, Group> groupFetch = (SingularAttributeJoin<GroupAssignment, Group>) root.fetch(GroupAssignment_.group, JoinType.LEFT);
query.orderBy(cb.asc(groupFetch.get(Group_.title)));

Я привел Fetch вручнуюв SingularAttributeJoin и после этого я могу использовать метод get для целей заказа, но я ищу правильный способ, как я могу сделать это без приведения вручную .

Класс GroupAssignment:

@Entity()
@Table(name = "group_assignment")
public class GroupAssignment {
  @Id
  @Column(name = "group_assignment_id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Integer id;

  @ManyToOne
  @JoinColumn(name = "group_id", nullable = false)
  private Group group;

  //other fields, getters and setters
}

Класс GroupAssignment_:

@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(GroupAssignment.class)
public abstract class GroupAssignment_ {
  public static volatile SingularAttribute<GroupAssignment, Integer> id;
  public static volatile SingularAttribute<GroupAssignment, Group> group;
}

Класс группы:

@Entity()
@Table(name = "navigation_group")
public class Group {
  @Id
  @Column(name = "group_id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Integer id;

  @Column(name = "title")
  private String title;

  //other fields, getters and setters
}

Класс Group_:

@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(Group.class)
public abstract class Group_ {
  public static volatile SingularAttribute<Group, Integer> id;
  public static volatile SingularAttribute<Group, String> title;
}

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Похоже, что правильный путь будет следующим:

query.orderBy(cb.asc(root.get(GroupAssignment_.group).get(Group_.title)));

Таким образом, используя множественный вызов метода .get, вы можете углубиться до необходимого уровня.

0 голосов
/ 13 ноября 2018

Я думаю, что javax.persistence.criteria.FetchParent может решить вашу проблему:

FetchParent<GroupAssignment, Group> groupFetch = root.fetch(GroupAssignment_.group, JoinType.LEFT);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...