Да, так и есть.Вероятно, не так много вариантов использования для этого.Учитывая
@Entity
public class A {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private Integer value;
public class ADto {
private Integer va;
public ADto(A a) {
this.va = a.getValue();
}
public ADto(Integer va) {
this.va = va;
}
Тогда
tx.begin();
A a1 = new A();
a1.setValue(1);
A a2 = new A();
a1.setValue(2);
em.persist(a1);
em.persist(a2);
tx.commit();
em.clear();
System.out.println("As usual");
em.createQuery("select new dto.ADto(a.value) from A a where a.value <= 2", ADto.class).getResultList();
System.out.println("As A");
em.createQuery("select new dto.ADto(a) from A a where a.value <= 2", ADto.class).getResultList();
дает вам
create table A (id integer generated by default as identity (start with 1), value integer, primary key (id))
create table B (id integer generated by default as identity (start with 1), value integer, primary key (id))
insert into A (id, value) values (default, ?)
insert into A (id, value) values (default, ?)
As usual
select a0_.value as col_0_0_ from A a0_ where a0_.value<=2
As A
select a0_.id as col_0_0_ from A a0_ where a0_.value<=2
select a0_.id as id1_0_0_, a0_.value as value2_0_0_ from A a0_ where a0_.id=?
select a0_.id as id1_0_0_, a0_.value as value2_0_0_ from A a0_ where a0_.id=?
И вам не нравится тот факт, что объект A выбирается каждый раз для нового ADtoпример.Вероятно, это так, потому что вы могли бы создать DTO с несколькими объектами, а не только с A, такими как A, B и C, и как бы JPA / Hibernate сделал это удобно в одном операторе select?Хотя он может выбрать все атрибуты, а затем отслеживать, какие атрибуты принадлежат каким объектам, а затем создать их и передать их в DTO, чтобы вы могли деконструировать их, что кажется редкой работой.Вероятно, это будет более эффективно и лучше, если вы выберете нужные атрибуты и сделаете из них конструктор, как в первом случае.