Хотите запрос в ленивом отношении? - PullRequest
0 голосов
/ 09 мая 2019

У меня есть объект с ленивыми отношениями, подобными этому:

@Getter
@Entity
@Table(name = "entity")
@SequenceGenerator(name = "seq_entity", sequenceName = "seq_entity", allocationSize = 1)
@DynamicUpdate
public class Entity {

    @Id
    @Column(name = "id_entity")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_entity")
    private Long id;

    @Setter
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_relation1")
    private Relation1 relation1;

    @Setter
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_relation2")
    private Relation2 relation2;

    // ...
}

Когда я делаю запрос для загрузки других отношений, я должен указать их как:

return jpaQuery() .select(qEntity) .distinct() .from(qEntity) .innerJoin(qEntity.relation1).fetchJoin() .leftJoin(qEntity.relation2).fetchJoin() .fetch();

Но я хочу загрузить их без указания в левые и внутренние соединения для одного запроса ... Есть ли способ загрузить все в активном режиме для одного запроса?Можно ли деактивировать FetchType.LAZY для одного запроса?

Я думаю о чем-то вроде

return jpaQuery() .select(qEntity) .distinct() .from(qEntity) .fetchEager();

1 Ответ

3 голосов
/ 09 мая 2019

Для этого вы можете использовать граф сущностей.Это будет что-то вроде этого:

EntityGraph<Post> entityGraph = entityManager.createEntityGraph(YourEntity.class);
entityGraph.addAttributeNodes("relation1");
entityGraph.addAttributeNodes("relation2");

И в запросе

TypedQuery<Post> typedQuery = entityManager.createQuery(criteriaQuery);
typedQuery.setHint("javax.persistence.loadgraph", entityGraph);
Post post = typedQuery.getSingleResult();

Это может быть заключено в граф именованного объекта (поверх объекта)

@NamedEntityGraph(
  name = "entity-with-all-relations",
  attributeNodes = {
    @NamedAttributeNode("relation1"),
    @NamedAttributeNode("relation2"),
  },

таким образоммногократно использовался много раз.Для этого вы используете EntityManager#getEntityGraph

...