Querydsl BooleanExpressions를 반환하는 정적 메서드로 클래스를 만들었으므로이 스프링 표현식을 Spring 데이터 저장소의 findAll()
또는 findOne()
메서드에 전달하고 응용 프로그램 전체에서 다시 사용할 수 있습니다. 여기처럼 : http://www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-part-five-querydsl/.Querydsl BooleanExpression 쿼리 최적화
내가 가지고있는 문제는 내 메서드에서 반환되는 BooleanExpression이 하위 최적화 된 것으로 보이는 쿼리를 생성하고 있다는 것입니다. 적어도 내 경우에는 그렇습니다.
public static BooleanExpression byExternalIdAndProviderId(
final String externalId, final Long providerId) {
QEListing listing = QEListing.eListing;
return listing.externalIds.any().externalId.equalsIgnoreCase(externalId)
.and(listing.externalIds.any().provider.id.eq(providerId));
}
쿼리 생성됩니다 다음 BooleanExpression을 반환
방법
이 같은 것을 반대로select elisting0_.id as id1_24_,
elisting0_.address1 as address2_24_,
elisting0_.address2 as address3_24_,
elisting0_.business_name as business4_24_,
elisting0_.city_id as city10_24_,
elisting0_.created_date as created5_24_,
elisting0_.latitude as latitude6_24_,
elisting0_.longitude as longitud7_24_,
elisting0_.master_ext_id as master11_24_,
elisting0_.modified_date as modified8_24_,
elisting0_.state_id as state12_24_,
elisting0_.zip as zip13_24_,
elisting0_.zip_4 as zip9_24_,
elisting0_1_.vanity_name as vanity1_34_,
elisting0_2_.account_id as account1_2_
from listings elisting0_
left outer join vanity_names elisting0_1_ on elisting0_.id=elisting0_1_.listing_id
left outer join accounts_to_listings elisting0_2_ on elisting0_.id=elisting0_2_.listing_id
where (
exists (
select 1
from external_ids eexternali1_
where (
eexternali1_.id in (
select externalid2_.external_id
from listing_to_external_id externalid2_
where elisting0_.id=externalid2_.listing_id))
and lower(eexternali1_.external_id)='123456'
)
)
and (
exists (
select 1
from external_ids eexternali3_
where (
eexternali3_.id in (
select externalid4_.external_id
from listing_to_external_id externalid4_
where elisting0_.id=externalid4_.listing_id
)
)
and eexternali3_.provider_id=1
)
)
:
select elisting0_.id as id1_24_,
elisting0_.address1 as address2_24_,
elisting0_.address2 as address3_24_,
elisting0_.business_name as business4_24_,
elisting0_.city_id as city10_24_,
elisting0_.created_date as created5_24_,
elisting0_.latitude as latitude6_24_,
elisting0_.longitude as longitud7_24_,
elisting0_.master_ext_id as master11_24_,
elisting0_.modified_date as modified8_24_,
elisting0_.state_id as state12_24_,
elisting0_.zip as zip13_24_,
elisting0_.zip_4 as zip9_24_,
elisting0_1_.vanity_name as vanity1_34_,
elisting0_2_.account_id as account1_2_
from listings elisting0_
left outer join vanity_names elisting0_1_ on elisting0_.id=elisting0_1_.listing_id
left outer join accounts_to_listings elisting0_2_ on elisting0_.id=elisting0_2_.listing_id
join listing_to_external_id a on elisting0_.id = a.listing_id
join external_ids b on a.external_id = b.id
where lower(b.external_id) = '123456'
and b.provider_id = 1
를 생성하는 방법이 있나요 더 최적의 쿼리를 제공하면서도 여전히 BooleanExpressions의 재사용 성을 제공하고 Spring D ata의 저장소?
봄 데이터로 Querydsl을 사용하는 유일한 방법은'QueryDslPredicateExecutor'를 확장하는 저장소에 조건자를 전달하는 것입니다. 나는 정말로 Querydsl을 사용하는 것을 즐긴다. 그러나이 쿼리는 나를 위해 문제가된다. 제가 가지고있는 것처럼 술어 이외의 Querydsl에서 스프링 데이터를 사용하는 다른 방법이 있습니까? 조인에서 결과 집합을 수정한다고 말하면 조인 된 테이블의조차도 모든 필드를 선택한다는 사실을 기반으로 반환 된 열을 변경한다는 의미입니까? –
Luke
조인은 반환되는 열은 수정하지 않지만 일치하는 행 수는 제한 및 오프셋과 같은 페이징 매개 변수를 변경합니다. findAll 메소드는 간단한 쿼리 케이스의 편리한 메소드입니다. 다른 대안은 전체 Querydsl 쿼리를 사용하는 것입니다. –
맞아요. 스프링 데이터가 사용하는 엔티티 관리자를 검색하고 섹션 2.1.5에서와 같이 새로운 JPAQuery()에 전달하고 싶습니다. http://www.querydsl.com/static/querydsl /2.9.0/reference/html/ch02.html#d0e185. 나는 따라갈거야? – Luke