On Dec 21, 2007, at 2:30 PM, Tore Halset wrote:

A wrapper is fine, but do you think this is fixable in Query as well?

Unfortunately I can't figure out how to make it work without breaking core Cayenne abstractions :-/


BTW, here is a skeleton of a parameterized wrapper that I tried to sketch out. Not complete of course, but the general idea. In a way aligned with the JPA query (so we can reuse it in the JPA/Cayenne bridge), only more user-friendly, as we can supply all the "hints" via dedicated methods.

// usage:
ObjectContext context = ...
SelectBuilder<Artist> query = SelectBuilder.create(context, Artist.class); List<Artist> artists = query.setQueryName("XYZ").addParameter("X", "1").fetch();

// wrapper class:
public class SelectBuilder<T> {

        static enum ResultType {
                OBJECT, DATA_ROW, OBJECT_ARRAY, SCALAR
        };

        protected Class<?> entityClass;
        protected ObjectContext context;

        // factory methods
        public static <T> SelectBuilder<T> create(ObjectContext context,
                        Class<T> resultClass) {
                return new SelectBuilder<T>(context, resultClass, 
ResultType.OBJECT);
        }

        public static SelectBuilder<DataRow> createForDataRows(
                        ObjectContext context, Class<?> resultClass) {
                return new SelectBuilder<DataRow>(context, resultClass,
                                ResultType.DATA_ROW);
        }

        private SelectBuilder(ObjectContext context, Class<?> entityClass,
                        ResultType type) {
                ...
        }

        // configuration methods
        public SelectBuilder<T> setQueryName(String mappedQueryName) {
               ...
                return this;
        }

        public SelectBuilder<T> addParameter(String key, Object value) {
               ...
                return this;
        }

       // .... etc.

        // execution methods
        public List<T> fetch() {
                ...
        }

        public T fetchSingleObject() {
                ...
        }

        public T fetchByPk(int id) {
                ...
        }
}


Andrus

Reply via email to