[QueryDSL] @QueryProjection (SELECT์ ๋์ ์ง์ )
ํ๋ก์ ์ (Projections)
QueryDSL์ ์ด์ฉํด Entity ์ ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋๋ผ, ์กฐํ ๋์์ ์ง์ ํ ์ ์๋ค.
ํน์ ์ปฌ๋ผ๋ง์ SELECT ํด์ค๋ ์ปค์คํ ๋ฉ์๋๋ฅผ ์์ฑํ ๊ฒฝ์ฐ,
Entity์์ ์ ์ฒด ํ๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ์๋๋ผ, ํน์ ๋์๋ง ๊ฐ์ ธ์ค๊ณ ์ถ๊ธฐ ๋๋ฌธ์
(๋๊ฐ์ ๊ฒฝ์ฐ) ์์ฑ์ ๋ฐฉ์์ธ Projectsions.constructor์ ์ด์ฉํ์ฌ DTO์ ์ ์ํ ํ๋๋ง์ ํธ์ถํ์๋ค.
๊ทธ๋ฐ๋ฐ DTO ์ค์์๋ ํน์ ํ๋๋ง ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๋ฉด?
@RequiredArgsConstructor
public class TestRepoImpl implements TestRepoCustom {
private final JPAQueryFactory jpaQueryFactory;
@Override
public List<TestDTO> find() {
QTestEntity hc3 = QTestEntity.testEntity;
return jpaQueryFactory
.select(Projections.constructor(TestDTO.class,
hc3.field1))
.from(hc3)
.groupBy(hc3.field1)
.orderBy(OrderByNull.DEFAULT)
.fetch();
}
}
@Getter
@Setter
@ToString
@AllArgsConstructor
public class TestDTO {
private String field1;
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<TestSubDTO> subList = new ArrayList<>();
}
TestDTO์์ field1๋ง ํธ์ถํ๋ ค๊ณ ํ๋๋ฐ, ์๊พธ ์๋ฌ๊ฐ ๋จ์ด์ง๋ค.
no constructor found for class com.xxx.demo.model.testDTOwith parameters: ...
์ฃผ๋ก DTO์์ ์ ์ํ๋ ํ๋์ Repo์์ ํํํ๊ณ ์ ํ๋ ํ๋๊ฐ ๋ถ์ผ์นํ์ฌ ๋ฐ์ํ๋ ๋ฌธ์ ์ด๋ค.
๋ชจ๋ ํ๋์ ํ์ /์์๊ฐ ์ผ์นํด์ผํ๋ฉฐ, ํ๋๋ช ๋ ์ผ์นํด์ผํ๋ค. ๋ค๋ฅด๋ค๋ฉด .as์ ์ฌ์ฉํด ๋ณ์นญ์ ์ง์ ํ์ฌ์ ๋ง์ถฐ์ฃผ์ด์ผํ๋ค.
๋๊ฐ์ ๊ฒฝ์ฐ์๋ ์๋ฌด๋๋ TestSubDTO ๊ฐ์ฒด๋ฅผ ๋ด์ subList ๋๋ฌธ์ธ ๊ฒ ๊ฐ์๋ค.
field1๋ง ๊ฐ์ ธ์ค๋ฉด ๋๋๋ฐ .... subList๋ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฉํด์ ์ ๊ฑฐํ ์๋ ์๊ณ ...
DTO ์ค์์๋ ํน์ ํ๋๋ง์ ๊ฐ์ ธ์ค๋๋ก ์ง์ ํ ์ ์์๊น ์ฐพ์๋ณด๋
DTO ์์ฑ์์ @QuertProjection ์ด๋ ธํ ์ด์ ์ ํ์ฉํ๋ฉด ๋๋ค๊ณ ํ๋ค.
@Getter
@Setter
@ToString
@AllArgsConstructor
public class TestDTO {
private String field1;
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<TestSubDTO> subList = new ArrayList<>();
@QueryProjection
public TestDTO(String field1) {
this.field1 = field1;
}
}
field1๋ง์ ์ ๊ฐ์ ธ์จ๋ค. ํด๊ฒฐ!