2013-07-26 2 views
1

저는 Java EE 기반 프로젝트에 대한 연결 기준 쿼리입니다.하지만 실제로 좋은 실행인지 여부는 확실하지 않습니다.기준 쿼리를 연결하는 것이 좋습니다.

코드를 줄이고 더 중요한 것은 초기 쿼리를 다시 사용할 수 있다는 장점이 많이 있습니다. 그러나 나는 그 단점이 무엇인지 알지 못한다.

한 번보고 내가 올바른 길을 가고 있는지 제안 해주세요. 그것은 내 프로젝트에서 우수하게 일하고있다.

..........................

public abstract class AbstractFacade<T> { 

    private Class<T> entityClass; 
    protected CriteriaQuery<T> criteriaQuery; 
    protected CriteriaBuilder criteriaBuilder; 
    protected Root<T> from; 
    protected List<Predicate> predicates; 

    @PostConstruct 
protected void _startQuery() { 
    this.criteriaBuilder = getEntityManager().getCriteriaBuilder(); 
    this.criteriaQuery = this.criteriaBuilder.createQuery(entityClass); 
    from = this.criteriaQuery.from(entityClass); 
    predicates = new ArrayList<Predicate>(); 
} 

.............. ............
} 


public abstract class AbstractUserLoggableFacade<T extends AbstractUserLoggable> extends AbstractFacade<T> { 

    ................. 
} 


public abstract class OrganizationTrackableFacade<T extends OrganizationalTrackable> extends AbstractUserLoggableFacade<T> { 


........................ 
} 

그리고 마지막으로 구현 클래스

.

@Stateless 
    public class DayStartFacade extends OrganizationTrackableFacade<DayStart> { 

     @TransactionAttribute(TransactionAttributeType.NEVER) 
     private DayStartFacade filterByEnded(Boolean b) { 
      this.predicates.add(criteriaBuilder.equal(from.get(DayStart_.isEnded), b)); 
      return this; 
     } 

     @TransactionAttribute(TransactionAttributeType.NEVER) 
     private DayStartFacade filterByOrganization(Organization o) { 
      this.predicates.add(criteriaBuilder.equal(from.get(OrganizationalTrackable_.organizationId), o)); 
      return this; 
     } 

그리고 여기 내 연결 방법이 있습니다. 이런 식으로 연결하는 것이 좋은 습관입니까?

public DayStart getCurrentDayStart() { 
     DayStart d = null; 
     try { 
      d = ((DayStartFacade) this.startQuery()).filterByEnded(Boolean.FALSE).filterByOrganization(userBean.getCurrentOrganization()).getSingleResult(); 
     } catch (javax.persistence.NonUniqueResultException e) { 
      System.out.println("No unique restult exception at getCurrentDayStart"); 
      e.printStackTrace(); 
     } catch (javax.persistence.NoResultException nre) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return d; 
    } 
} 

저는 JPA 2.0, Hibernate 및 GlassFish를 사용하고 있습니다.

답변

1

괜찮 으면 API가 허용하지 않습니다. javax.persistence.criteria 패키지가이 패턴으로 가득 차 있기 때문에 의도 된 것일 수 있습니다.

+0

사실, 나는 그 효율성과 신뢰성에 대해 의심하고있었습니다. 제안에 감사드립니다. 지금, 나는 또한 비슷한 이해를 가지고 있습니다. – Rajesh