2

私は自分の 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 を使用しています。

4

1 に答える 1

1

問題がなければ、API はそれを許可しません。javax.persistence.criteriaパッケージにはこの模様がぎっしり詰まっているので、意図したものと思われます。

于 2013-07-30T13:56:31.017 に答える