2013-07-26 43 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