2016-12-10 4 views
0

SpringData/QueryDSL 기본 리포지토리를 구축 중입니다. 다음과 같은 클래스 세트가 있습니다 :SpringData/QueryDSL에 쿼리 힌트를 적용하는 방법 findAll

@Entity 
@Table(name="t_ows_jo")   
@NamedEntityGraphs({ 
    @NamedEntityGraph(
     name="graph.Jo",            
     attributeNodes={ 
      ... 
     }, 
     subgraphs={ 
      ... 
     } 
    ) 
}) 
public class Jo { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="id") 
    protected Long id; 

    private String joNo; 
    private String vin; 
    private Date dateFiled; 
    private Integer mileage; 

    private Vehicle vehicle; 
    private Dealer dealer; 
    private List<JoJobRequest> jobRequest; 
    private List<JoJobDone>  jobDone; 

    ... 
} 

@NoRepositoryBean 
public interface BaseRepository<Entity, ID extends Serializable> extends JpaRepository<Entity, ID>, QueryDslPredicateExecutor<Entity> { 
    Entity retrieve(Map<String, Object> filters); 

    ... more custom methods here 


    List<Entity> listAll(Map<String, Object> qryParam, int pageStart, int pageSize, Sort sortOrder); 
} 

public class BaseRepositoryImpl<Entity, ID extends Serializable> extends QueryDslJpaRepository<Entity, ID> 
    implements BaseRepository<Entity, ID> { 

    @PersistenceContext 
    private EntityManager entityManager; 


    //... more codes here 


    @Override 
    public List<Entity> listAll(Map<String, Object> qryParam, int pageStart, int pageSize, Sort sortOrder) { 
     Page<Entity> entities = null; 

     Pageable pageReq = new PageRequest(pageStart, pageSize, sortOrder); 

     BooleanBuilder where = new BooleanBuilder(); 

     //build where here using qryParam 

     ... some more codes here 

     //get a reference to JPAQuery and apply query hints 
     //EntityGraph graph = getEm().getEntityGraph("graph.Jo"); 
     //query.setHint("javax.persistence.fetchgraph",graph); 

     entities = findAll(where.getValue(), pageRequest); //<<-----<<<< I want to apply query hints here 

     return entities.getContent(); 
    } 
} 

위의 BaseRepositoryImpl은 원하는대로 잘 작동합니다. 쿼리 힌트를 적용 할 수 있도록 findAll 방법의 JPAQuery에 대한 참조를 얻을 수

//get a reference to JPAQuery and apply query hints 
EntityGraph graph = getEntityManager().getEntityGraph("graph.Jo"); 
query.setHint("javax.persistence.fetchgraph",graph); 

entities = findAll(where.getValue(), pageRequest); //<<-----<<<< I want to apply query hints here 

이 가능 : 그러나, 나는 같은 EntityGraph 뭔가를 사용하여 쿼리 힌트를 추가 하시겠습니까?

findAll에 쿼리 힌트를 적용하려면 어떻게해야합니까?

나는 JPA 엔진과 같이 Hibernate v4.3.11.Final과 함께 QueryDSL v3.6.5와 SpringData v1.8.2를 사용하고있다.

어떤 도움이나 제안이라도 대단히 감사하겠습니다.

미리 감사드립니다. 마리오

답변

1

예 가능합니다. 당신은 당신의 자신의 findall은()를 쓸 수 있습니다, 그것은 간단합니다

@PersistenceContext 
private EntityManager em; 

public <T, Q extends EntityPathBase<T>> Page<T> findAll(Q path, Predicate predicate, Pageable pageable, EntityGraph fetchGraph) { 
    Querydsl querydsl = new Querydsl(em, new PathBuilder<>(path.getType(), path.getMetadata())); 
    JPAQuery countQuery = new JPAQuery(em).from(path).where(predicate); 
    long total = countQuery.count(); 

    JPAQuery query = new JPAQuery(em).from(path).where(predicate); 
    if (fetchGraph != null) { 
     query.setHint(QueryHints.FETCHGRAPH, fetchGraph); 
    } 
    if ((pageable == null) || (total > pageable.getOffset())) { 
     return new PageImpl<>(querydsl.applyPagination(pageable, query).list(path), pageable, total); 
    } else { 
     return new PageImpl<>(Collections.emptyList(), pageable, total); 
    } 
} 

경로 - 당신이 쿼리 엔티티의 생성 Q-대응. 예 : QJo.jo.

JPAQuery 인스턴스가 있으면 원하는 옵션과 힌트를 설정할 수 있습니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 나는 Q 경로를 통과하지 않기 때문에 솔루션을 사소한 조정할 필요가있다. 그럼에도 불구하고, 해결책은 제가 찾고있는 것이었고 그것은 정상적으로 작동했습니다. 많은 감사합니다. –

관련 문제