У меня есть следующий родительский объект:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@SuperBuilder
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(of = "id")
public class User {
@Id
private String id;
@NotBlank
private String name;
}
У меня есть следующий подкласс:
@Entity
@Data
@SuperBuilder
@AllArgsConstructor
@NoArgsConstructor
@ToString(of = {"id"})
@PrimaryKeyJoinColumn(name="id")
public class SubUser extends User {
@NotNull
private Long consume;
}
Я выполняю следующий запрос:
var hql = SELECT new com.mypackage.MyResult(su) From SubUser su
em.createQuery(hql).getResultList();
Класс MyResult:
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of="subUser")
@ToString(of={"subUser"})
public class MyResult {
private SubUser subUser;
}
Проблема в следующем: Hibernate всегда выполняет SELECT для каждой найденной строки. Это делает выбор, чтобы найти пользователя. В этом случае, если имеется 50 результатов, выполняется 50 SELECT.
Я бы хотел, чтобы это СОЕДИНЕНИЕ между пользователем и SubUser, только один раз, вместе с основным запросом.
* Я знаю, что я может отображаться непосредственно в SubUser, вместо «MyResult», это потому, что я буду использовать больше полей после решения этой проблемы, например,
private SubUser su;
private OtherObject other;
Версии:
Spring boot 2.2.5 .RELEASE Hibernate-core: 5.4.2.Final