0

私はデータベース エントリに対していくつかのフィルタリングを行っていますが、やや醜いコードになってしまいました。これは好ましくありません。

チェーンMyFilterResolverFactoryを構築して返すクラスがあります。MyFilterResolver

public abstract class MyFilterResolver {
    protected MyFilterResolver nextResolver = EMPTY;
    protected List<Predicate> predicates;

    public List<Predicate> resolve(MyFilter filter, CriteriaBuilder cb, Root<MyEntity> root) {
        this.predicates = new ArrayList<Predicate>();

        resolveFilter(filter, cb, root);

        this.predicates.addAll(this.nextResolver.resolve(filter, cb, root));
        return this.predicates;
    }

    protected abstract void resolveFilter(MyFilter filter, CriteriaBuilder cb, Root<MyEntity> root);

    public void attachNextResolver(MyFilterResolver nextResolver) {
        this.nextResolver = nextResolver;
    }

    public static MyFilterResolver EMPTY = new MyFilterResolver() {

        @Override
        public List<Predicate> resolve(MyFilter filter, CriteriaBuilder cb, Root<MyEntity> root) {
            return new ArrayList<Predicate>();
        }

        @Override
        protected void resolveFilter(MyFilter filter, CriteriaBuilder cb, Root<MyEntity> root) {
        }
    };
}

そして、それの醜い、具体的な実装:

public class MyDateFilterResolver extends
    MyFilterResolver {

    @Override
    protected void resolveFilter(MyFilter filter, CriteriaBuilder cb,
        Root<MyEntity> root) {

        if (filter != null) {
            Date dateExact = filter.getDateExact();
            Date dateAfter = filter.getDateAfter();
            Date dateBefore = filter.getDateBefore();

            if (dateExact != null) {
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(dateExact);

                calendar.set(Calendar.HOUR_OF_DAY, 0);
                calendar.set(Calendar.MINUTE, 0);
                calendar.set(Calendar.SECOND, 0);
                calendar.set(Calendar.MILLISECOND, 0);

                Date dayStart = calendar.getTime();

                calendar = Calendar.getInstance();
                calendar.setTime(dayStart);
                calendar.add(Calendar.DATE, 1);
                calendar.add(Calendar.MILLISECOND, -1);

                Date dayEnd = calendar.getTime();

                super.predicates.add(
                    cb.greaterThanOrEqualTo(
                        root.get("date").as(Date.class), 
                        dayStart
                    )
                );

                super.predicates.add(
                    cb.lessThanOrEqualTo(
                        root.get("date").as(Date.class), 
                        dayEnd
                    )
                );

            }

            if (dateAfter != null) {
                super.predicates.add(
                    cb.greaterThanOrEqualTo(
                        root.get("date").as(Date.class), 
                        dateAfter
                    )
                );
            }

            if (dateBefore != null) {
                predicates.add(
                    cb.lessThanOrEqualTo(
                        root.get("date").as(Date.class), 
                        dateBefore
                    )
                );
            }
        }
    }

}

MyFilterクラスは、ゲッター/セッターのみを持つ通常の POJO です。

これらのチェックを取り除きたいのif (something != null)ですが、方法がわかりません。

4

1 に答える 1