From 7c7295959855b881da1809c67a18d738c417b563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jyri-Matti=20L=C3=A4hteenm=C3=A4ki?= Date: Thu, 5 Mar 2015 08:32:52 +0200 Subject: [PATCH] parameterized EntityRepresentation --- src/main/java/fi/solita/utils/query/Dao.java | 46 +++++++------- .../java/fi/solita/utils/query/IEntity.java | 2 +- src/main/java/fi/solita/utils/query/Id.java | 2 +- .../fi/solita/utils/query/QueryUtils.java | 6 +- .../RelationCollectionAttribute.java | 8 +-- .../attributes/RelationListAttribute.java | 8 +-- .../attributes/RelationSetAttribute.java | 8 +-- .../attributes/RelationSingularAttribute.java | 8 +-- .../utils/query/backend/TypeProvider.java | 2 +- .../hibernate/HibernateTypeProvider.java | 2 +- .../query/execution/JpaBasicQueries.java | 26 ++++---- .../query/execution/JpaCriteriaQueries.java | 7 +-- .../query/execution/JpaProjectionQueries.java | 17 +++-- .../solita/utils/query/generation/Cast.java | 10 +-- .../query/generation/JpaCriteriaQuery.java | 54 ++++++++-------- .../utils/query/generation/NativeQuery.java | 4 +- .../ConstructorsAsJpaProjections.java | 62 ++++++++++++------- .../utils/query/projection/Project.java | 54 ++++++++-------- .../query/projection/ProjectionHelper.java | 12 ++-- .../projection/ProjectionResultUtil.java | 20 +++++- .../solita/utils/query/projection/Select.java | 2 +- .../fi/solita/utils/query/Department.java | 2 +- src/test/java/fi/solita/utils/query/Dto.java | 10 +-- .../java/fi/solita/utils/query/Employee.java | 2 +- .../fi/solita/utils/query/GeneratorTest.java | 17 ++++- .../fi/solita/utils/query/Municipality.java | 2 +- .../fi/solita/utils/query/QueryTestBase.java | 4 +- 27 files changed, 224 insertions(+), 173 deletions(-) diff --git a/src/main/java/fi/solita/utils/query/Dao.java b/src/main/java/fi/solita/utils/query/Dao.java index 006dac6..d182314 100644 --- a/src/main/java/fi/solita/utils/query/Dao.java +++ b/src/main/java/fi/solita/utils/query/Dao.java @@ -44,75 +44,75 @@ public Dao(JpaBasicQueries jpaBasicQueries, JpaCriteriaQueries jpaCriteriaQuerie this.qlQueries = qlQueries; } - public >> Id persist(E entity) { + public & Identifiable>> Id persist(E entity) { return jpaBasicQueries.persist(entity); } - public boolean isManaged(IEntity entity) { + public boolean isManaged(IEntity entity) { return jpaBasicQueries.isManaged(entity); } /** * Removes the entity corresponding to id from the database. Fails if not found. */ - public void remove(Id id) { + public & Removable> void remove(Id id) { jpaBasicQueries.remove(id); } - public > & Removable> void removeAll(CriteriaQuery query) { + public & Identifiable> & Removable> void removeAll(CriteriaQuery query) { jpaBasicQueries.removeAll(query); } /** * Get the entity corresponding to id. Fails if not found. */ - public E get(Id id) { + public > E get(Id id) { return jpaBasicQueries.get(id); } /** * Convert id to a proxy instance without hitting the database */ - public E toProxy(Id id) { + public > E toProxy(Id id) { return jpaBasicQueries.toProxy(id); } /** * Convert ids to a proxy instances without hitting the database */ - public Iterable toProxies(Iterable> ids) { + public > Iterable toProxies(Iterable> ids) { return jpaBasicQueries.toProxies(ids); } - public Option find(Id id) { + public > Option find(Id id) { return jpaBasicQueries.find(id); } /** * Get a proxy of relation from entity without hitting the database */ - public >, T> T toProxy(E entity, SingularAttribute relation) { + public & Identifiable>, T> T toProxy(E entity, SingularAttribute relation) { return jpaBasicQueries.toProxy(entity, relation); } /** * Get proxies of relation from entity. THIS HITS THE DATABASE. */ - public >, T extends IEntity> Collection getProxies(E entity, CollectionAttribute relation) { + public & Identifiable>, T extends IEntity> Collection getProxies(E entity, CollectionAttribute relation) { return jpaBasicQueries.getProxies(entity, relation); } /** * Get proxies of relation from entity. THIS HITS THE DATABASE. */ - public >, T extends IEntity> Set getProxies(E entity, SetAttribute relation) { + public & Identifiable>, T extends IEntity> Set getProxies(E entity, SetAttribute relation) { return jpaBasicQueries.getProxies(entity, relation); } /** * Get proxies of relation from entity. THIS HITS THE DATABASE. */ - public >, T extends IEntity> List getProxies(E entity, ListAttribute relation) { + public & Identifiable>, T extends IEntity> List getProxies(E entity, ListAttribute relation) { return jpaBasicQueries.getProxies(entity, relation); } @@ -150,7 +150,7 @@ public Option findFirst(CriteriaQuery query) throws NoOrderingSpecifie /** * Get the first row of query, if any */ - public Option findFirst(CriteriaQuery query, Iterable> ordering) { + public Option findFirst(CriteriaQuery query, Iterable> ordering) { return jpaCriteriaQueries.findFirst(query, ordering); } @@ -165,14 +165,14 @@ public List getMany(CriteriaQuery query, Page page) throws NoOrderingS return jpaCriteriaQueries.getMany(query, page); } - public List getMany(CriteriaQuery query, Iterable> ordering) { + public List getMany(CriteriaQuery query, Iterable> ordering) { return jpaCriteriaQueries.getMany(query, ordering); } /** * Get rows of query considering page */ - public List getMany(CriteriaQuery query, Page page, Iterable> ordering) { + public List getMany(CriteriaQuery query, Page page, Iterable> ordering) { return jpaCriteriaQueries.getMany(query, page, ordering); } @@ -181,56 +181,56 @@ public List getMany(CriteriaQuery query, Page page, It /** * Get the single row of query, projecting the result. Fails if multiple or no rows found. */ - public R get(CriteriaQuery query, MetaJpaConstructor projection) throws NoResultException, NonUniqueResultException { + public R get(CriteriaQuery query, MetaJpaConstructor projection) throws NoResultException, NonUniqueResultException { return jpaProjectionQueries.get(query, projection); } /** * Get the only row of query, if any, projecting the result. Fails if multiple or no rows found. */ - public Option find(CriteriaQuery query, MetaJpaConstructor projection) throws NonUniqueResultException { + public Option find(CriteriaQuery query, MetaJpaConstructor projection) throws NonUniqueResultException { return jpaProjectionQueries.find(query, projection); } /** * Get the first row of query, if any, projecting the result. Requires query to have ordering. */ - public Option findFirst(CriteriaQuery query, MetaJpaConstructor projection) { + public Option findFirst(CriteriaQuery query, MetaJpaConstructor projection) { return jpaProjectionQueries.findFirst(query, projection); } /** * Get the first row of query, if any, projecting the result */ - public Option findFirst(CriteriaQuery query, MetaJpaConstructor projection, Iterable> ordering) { + public Option findFirst(CriteriaQuery query, MetaJpaConstructor projection, Iterable> ordering) { return jpaProjectionQueries.findFirst(query, projection, ordering); } /** * Get all rows of query, projecting the results */ - public Collection getMany(CriteriaQuery query, MetaJpaConstructor projection) { + public Collection getMany(CriteriaQuery query, MetaJpaConstructor projection) { return jpaProjectionQueries.getMany(query, projection); } /** * Get rows of query considering page, projecting the results. Requires query to have ordering. */ - public List getMany(CriteriaQuery query, MetaJpaConstructor projection, Page page) throws NoOrderingSpecifiedException { + public List getMany(CriteriaQuery query, MetaJpaConstructor projection, Page page) throws NoOrderingSpecifiedException { return jpaProjectionQueries.getMany(query, projection, page); } /** * Get all rows of query, projecting the results */ - public List getMany(CriteriaQuery query, MetaJpaConstructor projection, Iterable> ordering) { + public List getMany(CriteriaQuery query, MetaJpaConstructor projection, Iterable> ordering) { return jpaProjectionQueries.getMany(query, projection, ordering); } /** * Get rows of query considering page, projecting the results */ - public List getMany(CriteriaQuery query, MetaJpaConstructor projection, Page page, Iterable> ordering) { + public List getMany(CriteriaQuery query, MetaJpaConstructor projection, Page page, Iterable> ordering) { return jpaProjectionQueries.getMany(query, projection, page, ordering); } diff --git a/src/main/java/fi/solita/utils/query/IEntity.java b/src/main/java/fi/solita/utils/query/IEntity.java index 0a34171..272e4c1 100644 --- a/src/main/java/fi/solita/utils/query/IEntity.java +++ b/src/main/java/fi/solita/utils/query/IEntity.java @@ -1,5 +1,5 @@ package fi.solita.utils.query; -public interface IEntity extends EntityRepresentation { +public interface IEntity extends EntityRepresentation { } diff --git a/src/main/java/fi/solita/utils/query/Id.java b/src/main/java/fi/solita/utils/query/Id.java index 6a9eb33..5e7190b 100644 --- a/src/main/java/fi/solita/utils/query/Id.java +++ b/src/main/java/fi/solita/utils/query/Id.java @@ -2,6 +2,6 @@ import java.io.Serializable; -public interface Id extends EntityRepresentation, Serializable { +public interface Id extends EntityRepresentation, Serializable { Class getOwningClass(); } diff --git a/src/main/java/fi/solita/utils/query/QueryUtils.java b/src/main/java/fi/solita/utils/query/QueryUtils.java index b3605ea..c170eaa 100644 --- a/src/main/java/fi/solita/utils/query/QueryUtils.java +++ b/src/main/java/fi/solita/utils/query/QueryUtils.java @@ -4,11 +4,11 @@ import static fi.solita.utils.functional.Collections.newList; import static fi.solita.utils.functional.Collections.newListOfSize; import static fi.solita.utils.functional.Functional.cons; -import static fi.solita.utils.functional.Functional.head; -import static fi.solita.utils.functional.Functional.isEmpty; import static fi.solita.utils.functional.Functional.flatMap; import static fi.solita.utils.functional.Functional.forall; import static fi.solita.utils.functional.Functional.grouped; +import static fi.solita.utils.functional.Functional.head; +import static fi.solita.utils.functional.Functional.isEmpty; import static fi.solita.utils.functional.Functional.map; import static fi.solita.utils.query.attributes.AttributeProxy.unwrap; @@ -155,7 +155,7 @@ public static void checkOrdering(CriteriaQuery query, Page page) throws N } } - public static final CriteriaQuery applyOrder(CriteriaQuery query, final Path selection, Iterable> orderings, final CriteriaBuilder cb) { + public static final CriteriaQuery applyOrder(CriteriaQuery query, final Path selection, Iterable> orderings, final CriteriaBuilder cb) { if (!isEmpty(orderings)) { query.orderBy(newList(map(QueryUtils_.order2jpaOrder().ap(cb, selection), orderings))); } else { diff --git a/src/main/java/fi/solita/utils/query/attributes/RelationCollectionAttribute.java b/src/main/java/fi/solita/utils/query/attributes/RelationCollectionAttribute.java index 3ba764d..b6bd4ff 100644 --- a/src/main/java/fi/solita/utils/query/attributes/RelationCollectionAttribute.java +++ b/src/main/java/fi/solita/utils/query/attributes/RelationCollectionAttribute.java @@ -11,16 +11,16 @@ import fi.solita.utils.query.meta.MetaJpaConstructor; class RelationCollectionAttribute> & Bindable> extends PluralAttributeProxy, R, A> implements CollectionAttribute, AdditionalQueryPerformingAttribute { - private final MetaJpaConstructor constructor; + private final MetaJpaConstructor, R, ?> constructor; @SuppressWarnings("unchecked") - public RelationCollectionAttribute(CollectionAttribute attribute, MetaJpaConstructor constructor) { + public > RelationCollectionAttribute(CollectionAttribute attribute, MetaJpaConstructor constructor) { super((A)(Object)attribute, CollectionType.COLLECTION, (Type)attribute.getElementType()); - this.constructor = (MetaJpaConstructor) constructor; + this.constructor = (MetaJpaConstructor, R, ?>) constructor; } @Override - public MetaJpaConstructor getConstructor() { + public MetaJpaConstructor, R, ?> getConstructor() { return constructor; } } \ No newline at end of file diff --git a/src/main/java/fi/solita/utils/query/attributes/RelationListAttribute.java b/src/main/java/fi/solita/utils/query/attributes/RelationListAttribute.java index f1907c0..9cd0243 100644 --- a/src/main/java/fi/solita/utils/query/attributes/RelationListAttribute.java +++ b/src/main/java/fi/solita/utils/query/attributes/RelationListAttribute.java @@ -11,16 +11,16 @@ import fi.solita.utils.query.meta.MetaJpaConstructor; class RelationListAttribute> & Bindable> extends PluralAttributeProxy, R, A> implements ListAttribute, AdditionalQueryPerformingAttribute { - private final MetaJpaConstructor constructor; + private final MetaJpaConstructor, R, ?> constructor; @SuppressWarnings("unchecked") - public RelationListAttribute(ListAttribute attribute, MetaJpaConstructor constructor) { + public > RelationListAttribute(ListAttribute attribute, MetaJpaConstructor constructor) { super((A)(Object)attribute, CollectionType.LIST, (Type)attribute.getElementType()); - this.constructor = (MetaJpaConstructor) constructor; + this.constructor = (MetaJpaConstructor, R, ?>) constructor; } @Override - public MetaJpaConstructor getConstructor() { + public MetaJpaConstructor, R, ?> getConstructor() { return constructor; } } \ No newline at end of file diff --git a/src/main/java/fi/solita/utils/query/attributes/RelationSetAttribute.java b/src/main/java/fi/solita/utils/query/attributes/RelationSetAttribute.java index 2267547..34ceb7e 100644 --- a/src/main/java/fi/solita/utils/query/attributes/RelationSetAttribute.java +++ b/src/main/java/fi/solita/utils/query/attributes/RelationSetAttribute.java @@ -11,16 +11,16 @@ import fi.solita.utils.query.meta.MetaJpaConstructor; class RelationSetAttribute> & Bindable> extends PluralAttributeProxy, R, A> implements SetAttribute, AdditionalQueryPerformingAttribute { - private final MetaJpaConstructor constructor; + private final MetaJpaConstructor, R, ?> constructor; @SuppressWarnings("unchecked") - public RelationSetAttribute(SetAttribute attribute, MetaJpaConstructor constructor) { + public > RelationSetAttribute(SetAttribute attribute, MetaJpaConstructor constructor) { super((A)(Object)attribute, CollectionType.SET, (Type)attribute.getElementType()); - this.constructor = (MetaJpaConstructor) constructor; + this.constructor = (MetaJpaConstructor, R, ?>) constructor; } @Override - public MetaJpaConstructor getConstructor() { + public MetaJpaConstructor, R, ?> getConstructor() { return constructor; } } \ No newline at end of file diff --git a/src/main/java/fi/solita/utils/query/attributes/RelationSingularAttribute.java b/src/main/java/fi/solita/utils/query/attributes/RelationSingularAttribute.java index 5b49c26..d661812 100644 --- a/src/main/java/fi/solita/utils/query/attributes/RelationSingularAttribute.java +++ b/src/main/java/fi/solita/utils/query/attributes/RelationSingularAttribute.java @@ -6,16 +6,16 @@ import fi.solita.utils.query.meta.MetaJpaConstructor; class RelationSingularAttribute extends SingularAttributeProxy implements AdditionalQueryPerformingAttribute { - private final MetaJpaConstructor constructor; + private final MetaJpaConstructor, R, ?> constructor; @SuppressWarnings("unchecked") - public RelationSingularAttribute(SingularAttribute attribute, MetaJpaConstructor constructor) { + public > RelationSingularAttribute(SingularAttribute attribute, MetaJpaConstructor constructor) { super((SingularAttribute) attribute); - this.constructor = (MetaJpaConstructor) constructor; + this.constructor = (MetaJpaConstructor, R, ?>) constructor; } @Override - public MetaJpaConstructor getConstructor() { + public MetaJpaConstructor, R, ?> getConstructor() { return constructor; } } \ No newline at end of file diff --git a/src/main/java/fi/solita/utils/query/backend/TypeProvider.java b/src/main/java/fi/solita/utils/query/backend/TypeProvider.java index bef69db..2ccfc3a 100644 --- a/src/main/java/fi/solita/utils/query/backend/TypeProvider.java +++ b/src/main/java/fi/solita/utils/query/backend/TypeProvider.java @@ -9,5 +9,5 @@ public interface TypeProvider { > Type idType(Class entityType); Type type(Class clazz); - Class getEntityClass(IEntity entity); + Class getEntityClass(IEntity entity); } diff --git a/src/main/java/fi/solita/utils/query/backend/hibernate/HibernateTypeProvider.java b/src/main/java/fi/solita/utils/query/backend/hibernate/HibernateTypeProvider.java index 44ddc20..87e6131 100644 --- a/src/main/java/fi/solita/utils/query/backend/hibernate/HibernateTypeProvider.java +++ b/src/main/java/fi/solita/utils/query/backend/hibernate/HibernateTypeProvider.java @@ -166,7 +166,7 @@ public Type type(final Class clazz) { } @Override - public Class getEntityClass(IEntity entity) { + public Class getEntityClass(IEntity entity) { return HibernateProxyHelper.getClassWithoutInitializingProxy(entity); } } diff --git a/src/main/java/fi/solita/utils/query/execution/JpaBasicQueries.java b/src/main/java/fi/solita/utils/query/execution/JpaBasicQueries.java index d225ea2..c836ad6 100644 --- a/src/main/java/fi/solita/utils/query/execution/JpaBasicQueries.java +++ b/src/main/java/fi/solita/utils/query/execution/JpaBasicQueries.java @@ -58,20 +58,20 @@ public JpaBasicQueries(Function0 em, ProjectionHelper projectionS } @SuppressWarnings("unchecked") - public >> Id persist(E entity) { + public & Identifiable>> Id persist(E entity) { em.apply().persist(entity); return (Id) entity.getId(); } - public boolean isManaged(IEntity entity) { + public boolean isManaged(IEntity entity) { return em.apply().contains(entity); } - public void remove(Id id) { + public & Removable> void remove(Id id) { em.apply().remove(toProxy(id)); } - public > & Removable> void removeAll(CriteriaQuery query) { + public & Identifiable> & Removable> void removeAll(CriteriaQuery query) { CriteriaQuery q = em.apply().getCriteriaBuilder().createQuery(); JpaCriteriaCopy.copyCriteriaWithoutSelect(query, q, em.apply().getCriteriaBuilder()); From selection = resolveSelection(query, q); @@ -85,7 +85,7 @@ public > & Removable> void remo } } - public E get(Id id) { + public > E get(Id id) { E ret = em.apply().find(id.getOwningClass(), id); if (ret == null) { throw new EntityNotFoundException("Entity of type " + id.getOwningClass().getName() + " with id " + id + " not found."); @@ -93,15 +93,15 @@ public E get(Id id) { return ret; } - public E toProxy(Id id) { + public > E toProxy(Id id) { return em.apply().getReference(id.getOwningClass(), id); } - public Iterable toProxies(Iterable> ids) { + public > Iterable toProxies(Iterable> ids) { return map(JpaBasicQueries_.toProxy().ap(this), ids); } - public Option find(Id id) { + public > Option find(Id id) { return Option.of(em.apply().find(id.getOwningClass(), id)); } @@ -110,7 +110,7 @@ public Option find(Id id) { * (entity already has an ID for a ToOne relation, so this is possible) */ @SuppressWarnings("unchecked") - public >, T> T toProxy(E entity, SingularAttribute relation) { + public >, T> T toProxy(E entity, SingularAttribute relation) { checkOptionalAttributes(relation); Field field = (Field)relation.getJavaMember(); @@ -131,20 +131,20 @@ public >, T> T toProxy( } } - public >, T extends IEntity> Collection getProxies(E entity, CollectionAttribute relation) { + public & Identifiable>, T extends IEntity> Collection getProxies(E entity, CollectionAttribute relation) { return newList(getProxiesIt(entity, relation)); } - public >, T extends IEntity> Set getProxies(E entity, SetAttribute relation) { + public & Identifiable>, T extends IEntity> Set getProxies(E entity, SetAttribute relation) { return newSet(getProxiesIt(entity, relation)); } - public >, T extends IEntity> List getProxies(E entity, ListAttribute relation) { + public & Identifiable>, T extends IEntity> List getProxies(E entity, ListAttribute relation) { return newList(getProxiesIt(entity, relation)); } @SuppressWarnings("unchecked") - private >, T extends IEntity, C extends Collection> Iterable getProxiesIt(E entity, PluralAttribute relation) { + private & Identifiable>, T extends IEntity, C extends Collection> Iterable getProxiesIt(E entity, PluralAttribute relation) { SingularAttribute> id = QueryUtils.id(relation.getBindableJavaType(), em.apply()); CriteriaQuery> query = em.apply().getCriteriaBuilder().createQuery(id.getBindableJavaType()); Root root = (Root) query.from(typeProvider.getEntityClass(entity)); diff --git a/src/main/java/fi/solita/utils/query/execution/JpaCriteriaQueries.java b/src/main/java/fi/solita/utils/query/execution/JpaCriteriaQueries.java index d747933..ee727f6 100644 --- a/src/main/java/fi/solita/utils/query/execution/JpaCriteriaQueries.java +++ b/src/main/java/fi/solita/utils/query/execution/JpaCriteriaQueries.java @@ -21,7 +21,6 @@ import fi.solita.utils.functional.Function0; import fi.solita.utils.functional.Option; -import fi.solita.utils.query.IEntity; import fi.solita.utils.query.JpaCriteriaCopy; import fi.solita.utils.query.Order; import fi.solita.utils.query.Page; @@ -67,7 +66,7 @@ public Option findFirst(CriteriaQuery query) throws NoOrderingSpecifie return headOption(getMany(query, Page.FIRST.withSize(1))); } - public Option findFirst(CriteriaQuery query, Iterable> ordering) { + public Option findFirst(CriteriaQuery query, Iterable> ordering) { return headOption(getMany(query, Page.FIRST.withSize(1), ordering)); } @@ -81,11 +80,11 @@ public List getMany(CriteriaQuery query, Page page) throws NoOrderingS return queryExecutor.getMany(query, page); } - public List getMany(CriteriaQuery query, Iterable> ordering) { + public List getMany(CriteriaQuery query, Iterable> ordering) { return getMany(query, Page.NoPaging, ordering); } - public List getMany(CriteriaQuery query, Page page, Iterable> ordering) { + public List getMany(CriteriaQuery query, Page page, Iterable> ordering) { return queryExecutor.getMany(applyOrder(query, resolveSelectionPath(query), ordering, em.apply().getCriteriaBuilder()), page); } } diff --git a/src/main/java/fi/solita/utils/query/execution/JpaProjectionQueries.java b/src/main/java/fi/solita/utils/query/execution/JpaProjectionQueries.java index a576158..06288b6 100644 --- a/src/main/java/fi/solita/utils/query/execution/JpaProjectionQueries.java +++ b/src/main/java/fi/solita/utils/query/execution/JpaProjectionQueries.java @@ -21,7 +21,6 @@ import fi.solita.utils.functional.Function0; import fi.solita.utils.functional.Option; -import fi.solita.utils.query.IEntity; import fi.solita.utils.query.JpaCriteriaCopy; import fi.solita.utils.query.Order; import fi.solita.utils.query.Page; @@ -45,7 +44,7 @@ public JpaProjectionQueries(Function0 em, ProjectionHelper projec this.queryExecutor = queryExecutor; } - public R get(CriteriaQuery query, MetaJpaConstructor constructor) throws NoResultException, NonUniqueResultException { + public R get(CriteriaQuery query, MetaJpaConstructor constructor) throws NoResultException, NonUniqueResultException { CriteriaQuery q = em.apply().getCriteriaBuilder().createQuery(); JpaCriteriaCopy.copyCriteriaWithoutSelect(query, q, em.apply().getCriteriaBuilder()); From selection = QueryUtils.resolveSelection(query, q); @@ -56,7 +55,7 @@ public R get(CriteriaQuery query, MetaJpaConstructor Option find(CriteriaQuery query, MetaJpaConstructor constructor) throws NonUniqueResultException { + public Option find(CriteriaQuery query, MetaJpaConstructor constructor) throws NonUniqueResultException { try { return Some(get(query, constructor)); } catch (NoResultException e) { @@ -64,30 +63,30 @@ public Option find(CriteriaQuery query, MetaJpaCons } } - public Option findFirst(CriteriaQuery query, MetaJpaConstructor constructor) throws NoOrderingSpecifiedException { + public Option findFirst(CriteriaQuery query, MetaJpaConstructor constructor) throws NoOrderingSpecifiedException { return headOption(getMany(query, constructor, Page.FIRST.withSize(1))); } - public Option findFirst(CriteriaQuery query, MetaJpaConstructor constructor, Iterable> ordering) { + public Option findFirst(CriteriaQuery query, MetaJpaConstructor constructor, Iterable> ordering) { return headOption(getMany(query, constructor, Page.FIRST.withSize(1), ordering)); } - public Collection getMany(CriteriaQuery query, MetaJpaConstructor constructor) throws NoOrderingSpecifiedException { + public Collection getMany(CriteriaQuery query, MetaJpaConstructor constructor) throws NoOrderingSpecifiedException { return getMany(query, constructor, Page.NoPaging); } - public List getMany(CriteriaQuery query, MetaJpaConstructor constructor, Page page) throws NoOrderingSpecifiedException { + public List getMany(CriteriaQuery query, MetaJpaConstructor constructor, Page page) throws NoOrderingSpecifiedException { QueryUtils.applyOrder(query, resolveSelection(query), em.apply().getCriteriaBuilder()); QueryUtils.checkOrdering(query, page); List> noOrdering = Collections.emptyList(); return getMany(query, constructor, page, noOrdering); } - public List getMany(CriteriaQuery query, MetaJpaConstructor constructor, Iterable> ordering) { + public List getMany(CriteriaQuery query, MetaJpaConstructor constructor, Iterable> ordering) { return getMany(query, constructor, Page.NoPaging, ordering); } - public List getMany(CriteriaQuery query, MetaJpaConstructor constructor, Page page, Iterable> ordering) { + public List getMany(CriteriaQuery query, MetaJpaConstructor constructor, Page page, Iterable> ordering) { CriteriaQuery q = em.apply().getCriteriaBuilder().createQuery(); JpaCriteriaCopy.copyCriteriaWithoutSelect(query, q, em.apply().getCriteriaBuilder()); From selection = resolveSelection(query, q); diff --git a/src/main/java/fi/solita/utils/query/generation/Cast.java b/src/main/java/fi/solita/utils/query/generation/Cast.java index db9239b..ee73a3e 100644 --- a/src/main/java/fi/solita/utils/query/generation/Cast.java +++ b/src/main/java/fi/solita/utils/query/generation/Cast.java @@ -38,27 +38,27 @@ public static SingularAttribute> optionalSubtype(SingularAtt } @SuppressWarnings("unchecked") - public static , T> SingularAttribute castSuper(SingularAttribute attribute) { + public static & Identifiable, T> SingularAttribute castSuper(SingularAttribute attribute) { return (SingularAttribute) attribute; } @SuppressWarnings("unchecked") - public static , T> SingularAttribute cast(SingularAttribute attribute) { + public static & Identifiable, T> SingularAttribute cast(SingularAttribute attribute) { return (SingularAttribute) attribute; } @SuppressWarnings("unchecked") - public static , T> CollectionAttribute cast(CollectionAttribute attribute) { + public static & Identifiable, T> CollectionAttribute cast(CollectionAttribute attribute) { return (CollectionAttribute) attribute; } @SuppressWarnings("unchecked") - public static , T> SetAttribute cast(SetAttribute attribute) { + public static & Identifiable, T> SetAttribute cast(SetAttribute attribute) { return (SetAttribute) attribute; } @SuppressWarnings("unchecked") - public static , T> ListAttribute cast(ListAttribute attribute) { + public static & Identifiable, T> ListAttribute cast(ListAttribute attribute) { return (ListAttribute) attribute; } } diff --git a/src/main/java/fi/solita/utils/query/generation/JpaCriteriaQuery.java b/src/main/java/fi/solita/utils/query/generation/JpaCriteriaQuery.java index de222e2..65e075c 100644 --- a/src/main/java/fi/solita/utils/query/generation/JpaCriteriaQuery.java +++ b/src/main/java/fi/solita/utils/query/generation/JpaCriteriaQuery.java @@ -31,18 +31,18 @@ public JpaCriteriaQuery(Function0 em, TypeProvider typeProvider) this.typeProvider = typeProvider; } - public CriteriaQuery single(Id id) { + public > CriteriaQuery single(Id id) { CriteriaQuery query = em.apply().getCriteriaBuilder().createQuery(id.getOwningClass()); Root root = query.from(id.getOwningClass()); return query.where(em.apply().getCriteriaBuilder().equal(root.get(QueryUtils.id(id.getOwningClass(), em.apply())), id)); } - public CriteriaQuery all(Class entityClass) { + public > CriteriaQuery all(Class entityClass) { CriteriaQuery query = em.apply().getCriteriaBuilder().createQuery(entityClass); return query.select(query.from(entityClass)); } - public CriteriaQuery matching(SingularAttribute first, Id firstId) { + public CriteriaQuery matching(SingularAttribute first, Id firstId) { CriteriaBuilder cb = em.apply().getCriteriaBuilder(); Class rootType = first.getDeclaringType().getJavaType(); CriteriaQuery query = cb.createQuery(rootType); @@ -51,7 +51,7 @@ public CriteriaQuery matching(Singular return query; } - public CriteriaQuery matching(SingularAttribute relation, A value) { + public CriteriaQuery matching(SingularAttribute relation, A value) { CriteriaBuilder cb = em.apply().getCriteriaBuilder(); Class rootType = relation.getDeclaringType().getJavaType(); CriteriaQuery query = cb.createQuery(rootType); @@ -60,7 +60,7 @@ public CriteriaQuery matching(SingularAttribute CriteriaQuery matching(SingularAttribute first, SingularAttribute second, Id firstId, Id secondId) { + public CriteriaQuery matching(SingularAttribute first, SingularAttribute second, Id firstId, Id secondId) { CriteriaBuilder cb = em.apply().getCriteriaBuilder(); Class rootType = first.getDeclaringType().getJavaType(); CriteriaQuery query = cb.createQuery(rootType); @@ -70,7 +70,7 @@ public CriteriaQuery CriteriaQuery matching(SingularAttribute first, SingularAttribute second, A firstValue, B secondValue) { + public CriteriaQuery matching(SingularAttribute first, SingularAttribute second, A firstValue, B secondValue) { CriteriaBuilder cb = em.apply().getCriteriaBuilder(); Class rootType = first.getDeclaringType().getJavaType(); CriteriaQuery query = cb.createQuery(rootType); @@ -80,7 +80,7 @@ public CriteriaQuery matching(SingularAttribute CriteriaQuery matching(SingularAttribute first, SingularAttribute second, SingularAttribute third, Id firstId, Id secondId, Id thirdId) { + public CriteriaQuery matching(SingularAttribute first, SingularAttribute second, SingularAttribute third, Id firstId, Id secondId, Id thirdId) { CriteriaBuilder cb = em.apply().getCriteriaBuilder(); Class rootType = first.getDeclaringType().getJavaType(); CriteriaQuery query = cb.createQuery(rootType); @@ -91,7 +91,7 @@ public CriteriaQuery matching(SingularAttribute first, SingularAttribute second, SingularAttribute third, A firstValue, B secondValue, C thirdValue) { + public CriteriaQuery matching(SingularAttribute first, SingularAttribute second, SingularAttribute third, A firstValue, B secondValue, C thirdValue) { CriteriaBuilder cb = em.apply().getCriteriaBuilder(); Class rootType = first.getDeclaringType().getJavaType(); CriteriaQuery query = cb.createQuery(rootType); @@ -103,7 +103,7 @@ public CriteriaQuery matching(SingularAttribute< } @SuppressWarnings("unchecked") - public CriteriaQuery ofIds(Iterable> ids, Class entityClass) { + public CriteriaQuery ofIds(Iterable> ids, Class entityClass) { CriteriaQuery query = em.apply().getCriteriaBuilder().createQuery(); if (ids.iterator().hasNext()) { Root root = query.from(entityClass); @@ -119,48 +119,48 @@ public CriteriaQuery ofIds(Iterable, R1 extends IEntity, A1 extends Attribute & Bindable> + public & Identifiable, R1, A1 extends Attribute & Bindable> CriteriaQuery related(E entity, A1 r1) { return doRelated(entity, r1); } - public , R1 extends IEntity, R2 extends IEntity, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable> + public & Identifiable, R1, R2, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable> CriteriaQuery related(E entity, A1 r1, A2 r2) { return doRelated(entity, r1, r2); } - public , R1 extends IEntity, R2 extends IEntity, R3 extends IEntity, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable> + public & Identifiable, R1, R2, R3, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable> CriteriaQuery related(E entity, A1 r1, A2 r2, A3 r3) { return doRelated(entity, r1, r2, r3); } - public , R1 extends IEntity, R2 extends IEntity, R3 extends IEntity, R4 extends IEntity, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable> + public & Identifiable, R1, R2, R3, R4, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable> CriteriaQuery related(E entity, A1 r1, A2 r2, A3 r3, A4 r4) { return doRelated(entity, r1, r2, r3, r4); } - public , R1 extends IEntity, R2 extends IEntity, R3 extends IEntity, R4 extends IEntity, R5 extends IEntity, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable> + public & Identifiable, R1, R2, R3, R4, R5, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable> CriteriaQuery related(E entity, A1 r1, A2 r2, A3 r3, A4 r4, A5 r5) { return doRelated(entity, r1, r2, r3, r4, r5); } - public , R1 extends IEntity, R2 extends IEntity, R3 extends IEntity, R4 extends IEntity, R5 extends IEntity, R6 extends IEntity, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable, A6 extends Attribute & Bindable> + public & Identifiable, R1, R2, R3, R4, R5, R6, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable, A6 extends Attribute & Bindable> CriteriaQuery related(E entity, A1 r1, A2 r2, A3 r3, A4 r4, A5 r5, A6 r6) { return doRelated(entity, r1, r2, r3, r4, r5, r6); } - public , R1 extends IEntity, R2 extends IEntity, R3 extends IEntity, R4 extends IEntity, R5 extends IEntity, R6 extends IEntity, R7 extends IEntity, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable, A6 extends Attribute & Bindable, A7 extends Attribute & Bindable> + public & Identifiable, R1, R2, R3, R4, R5, R6, R7, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable, A6 extends Attribute & Bindable, A7 extends Attribute & Bindable> CriteriaQuery related(E entity, A1 r1, A2 r2, A3 r3, A4 r4, A5 r5, A6 r6, A7 r7) { return doRelated(entity, r1, r2, r3, r4, r5, r6, r7); } - public , R1 extends IEntity, R2 extends IEntity, R3 extends IEntity, R4 extends IEntity, R5 extends IEntity, R6 extends IEntity, R7 extends IEntity, R8 extends IEntity, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable, A6 extends Attribute & Bindable, A7 extends Attribute & Bindable, A8 extends Attribute & Bindable> + public & Identifiable, R1, R2, R3, R4, R5, R6, R7, R8, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable, A6 extends Attribute & Bindable, A7 extends Attribute & Bindable, A8 extends Attribute & Bindable> CriteriaQuery related(E entity, A1 r1, A2 r2, A3 r3, A4 r4, A5 r5, A6 r6, A7 r7, A8 r8) { return doRelated(entity, r1, r2, r3, r4, r5, r6, r7, r8); } - private , R> CriteriaQuery doRelated(E entity, Attribute... attributes) { + private & Identifiable, R> CriteriaQuery doRelated(E entity, Attribute... attributes) { CriteriaQuery query = em.apply().getCriteriaBuilder().createQuery(); @SuppressWarnings("unchecked") Root root = (Root) query.from(typeProvider.getEntityClass(entity)); @@ -175,47 +175,47 @@ private , R> CriteriaQuery doRelated(E en return ret; } - public & Bindable, R1 extends IEntity> + public & Bindable, R1> CriteriaQuery related(A1 r1, CriteriaQuery query) { return doRelated(query, r1); } - public , R1 extends IEntity, R2 extends IEntity, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable> + public , R1, R2, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable> CriteriaQuery related(A1 r1, A2 r2, CriteriaQuery query) { return doRelated(query, r1, r2); } - public , R1 extends IEntity, R2 extends IEntity, R3 extends IEntity, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable> + public , R1, R2, R3, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable> CriteriaQuery related(A1 r1, A2 r2, A3 r3, CriteriaQuery query) { return doRelated(query, r1, r2, r3); } - public , R1 extends IEntity, R2 extends IEntity, R3 extends IEntity, R4 extends IEntity, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable> + public , R1, R2, R3, R4, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable> CriteriaQuery related(A1 r1, A2 r2, A3 r3, A4 r4, CriteriaQuery query) { return doRelated(query, r1, r2, r3, r4); } - public , R1 extends IEntity, R2 extends IEntity, R3 extends IEntity, R4 extends IEntity, R5 extends IEntity, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable> + public , R1, R2, R3, R4, R5, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable> CriteriaQuery related(A1 r1, A2 r2, A3 r3, A4 r4, A5 r5, CriteriaQuery query) { return doRelated(query, r1, r2, r3, r4, r5); } - public , R1 extends IEntity, R2 extends IEntity, R3 extends IEntity, R4 extends IEntity, R5 extends IEntity, R6 extends IEntity, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable, A6 extends Attribute & Bindable> + public , R1, R2, R3, R4, R5, R6, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable, A6 extends Attribute & Bindable> CriteriaQuery related(A1 r1, A2 r2, A3 r3, A4 r4, A5 r5, A6 r6, CriteriaQuery query) { return doRelated(query, r1, r2, r3, r4, r5, r6); } - public , R1 extends IEntity, R2 extends IEntity, R3 extends IEntity, R4 extends IEntity, R5 extends IEntity, R6 extends IEntity, R7 extends IEntity, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable, A6 extends Attribute & Bindable, A7 extends Attribute & Bindable> + public , R1, R2, R3, R4, R5, R6, R7, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable, A6 extends Attribute & Bindable, A7 extends Attribute & Bindable> CriteriaQuery related(A1 r1, A2 r2, A3 r3, A4 r4, A5 r5, A6 r6, A7 r7, CriteriaQuery query) { return doRelated(query, r1, r2, r3, r4, r5, r6, r7); } - public , R1 extends IEntity, R2 extends IEntity, R3 extends IEntity, R4 extends IEntity, R5 extends IEntity, R6 extends IEntity, R7 extends IEntity, R8 extends IEntity, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable, A6 extends Attribute & Bindable, A7 extends Attribute & Bindable, A8 extends Attribute & Bindable> + public , R1, R2, R3, R4, R5, R6, R7, R8, A1 extends Attribute & Bindable, A2 extends Attribute & Bindable, A3 extends Attribute & Bindable, A4 extends Attribute & Bindable, A5 extends Attribute & Bindable, A6 extends Attribute & Bindable, A7 extends Attribute & Bindable, A8 extends Attribute & Bindable> CriteriaQuery related(A1 r1, A2 r2, A3 r3, A4 r4, A5 r5, A6 r6, A7 r7, A8 r8, CriteriaQuery query) { return doRelated(query, r1, r2, r3, r4, r5, r6, r7, r8); } - private + private CriteriaQuery doRelated(CriteriaQuery query, Attribute... attributes) { CriteriaQuery q = em.apply().getCriteriaBuilder().createQuery(); diff --git a/src/main/java/fi/solita/utils/query/generation/NativeQuery.java b/src/main/java/fi/solita/utils/query/generation/NativeQuery.java index f397e71..b6ed34c 100644 --- a/src/main/java/fi/solita/utils/query/generation/NativeQuery.java +++ b/src/main/java/fi/solita/utils/query/generation/NativeQuery.java @@ -61,11 +61,11 @@ public NativeQueryVoid(String query, Map>>> param super(query, Collections.>>>emptyList(), params); } - public NativeQuerySingleEntity returns(Type entityType) { + public > NativeQuerySingleEntity returns(Type entityType) { return new NativeQuerySingleEntity(query, withRetval(ENTITY_RETURN_VALUE, entityType), params); } - public NativeQuerySingleEntity> returnsOptional(Type.Optional entityType) { + public > NativeQuerySingleEntity> returnsOptional(Type.Optional entityType) { return new NativeQuerySingleEntity>(query, withRetval(ENTITY_RETURN_VALUE, entityType), params); } diff --git a/src/main/java/fi/solita/utils/query/meta/generators/ConstructorsAsJpaProjections.java b/src/main/java/fi/solita/utils/query/meta/generators/ConstructorsAsJpaProjections.java index 318a7fa..8344a97 100644 --- a/src/main/java/fi/solita/utils/query/meta/generators/ConstructorsAsJpaProjections.java +++ b/src/main/java/fi/solita/utils/query/meta/generators/ConstructorsAsJpaProjections.java @@ -1,5 +1,17 @@ package fi.solita.utils.query.meta.generators; +import static fi.solita.utils.functional.Collections.newList; +import static fi.solita.utils.functional.Functional.cons; +import static fi.solita.utils.functional.Functional.filter; +import static fi.solita.utils.functional.Functional.flatMap; +import static fi.solita.utils.functional.Functional.map; +import static fi.solita.utils.functional.Functional.mkString; +import static fi.solita.utils.functional.Functional.zip; +import static fi.solita.utils.functional.Functional.zipWithIndex; +import static fi.solita.utils.functional.FunctionalA.concat; +import static fi.solita.utils.functional.FunctionalS.range; +import static fi.solita.utils.functional.Option.Some; +import static fi.solita.utils.functional.Transformers.prepend; import static fi.solita.utils.meta.Helpers.boxed; import static fi.solita.utils.meta.Helpers.containedType; import static fi.solita.utils.meta.Helpers.element2Constructors; @@ -19,18 +31,6 @@ import static fi.solita.utils.meta.generators.Content.EmptyLine; import static fi.solita.utils.meta.generators.Content.catchBlock; import static fi.solita.utils.meta.generators.Content.reflectionInvokationArgs; -import static fi.solita.utils.functional.Collections.newList; -import static fi.solita.utils.functional.Functional.cons; -import static fi.solita.utils.functional.Functional.mkString; -import static fi.solita.utils.functional.Functional.zip; -import static fi.solita.utils.functional.Functional.zipWithIndex; -import static fi.solita.utils.functional.FunctionalA.concat; -import static fi.solita.utils.functional.Functional.filter; -import static fi.solita.utils.functional.Functional.flatMap; -import static fi.solita.utils.functional.Functional.map; -import static fi.solita.utils.functional.FunctionalS.range; -import static fi.solita.utils.functional.Option.Some; -import static fi.solita.utils.functional.Transformers.prepend; import java.util.Arrays; import java.util.Collection; @@ -56,15 +56,15 @@ import javax.persistence.metamodel.SetAttribute; import javax.persistence.metamodel.SingularAttribute; -import fi.solita.utils.meta.Helpers; -import fi.solita.utils.meta.generators.Generator; -import fi.solita.utils.meta.generators.GeneratorOptions; import fi.solita.utils.functional.Apply; import fi.solita.utils.functional.Collections; import fi.solita.utils.functional.Function1; import fi.solita.utils.functional.Function3; import fi.solita.utils.functional.Option; import fi.solita.utils.functional.Transformer; +import fi.solita.utils.meta.Helpers; +import fi.solita.utils.meta.generators.Generator; +import fi.solita.utils.meta.generators.GeneratorOptions; import fi.solita.utils.query.EntityRepresentation; import fi.solita.utils.query.IEntity; import fi.solita.utils.query.Id; @@ -103,7 +103,7 @@ public String transform(CharSequence source) { public static Function3, Iterable> constructorGen = new Function3, Iterable>() { @Override - public Iterable apply(Helpers.EnvDependent helper, ConstructorsAsJpaProjections.Options options, Map.Entry entry) { + public Iterable apply(final Helpers.EnvDependent helper, ConstructorsAsJpaProjections.Options options, Map.Entry entry) { ExecutableElement constructor = entry.getValue(); TypeElement enclosingElement = (TypeElement) constructor.getEnclosingElement(); String enclosingElementQualifiedName = qualifiedName.apply(enclosingElement); @@ -117,9 +117,14 @@ public Iterable apply(Helpers.EnvDependent helper, ConstructorsAsJpaProj Class attributeClass; String otherTypeParams; TypeMirror argumentType = argument.asType(); - if (helper.isSubtype(argumentType, Id.class)) { + if (helper.isSameType(argumentType, Id.class)) { attributeClass = SingularAttribute.class; - otherTypeParams = "? extends " + importType(EntityRepresentation.class); + String elementType = containedType(argument); + otherTypeParams = "? extends " + importType(EntityRepresentation.class) + (elementType.equals("?") ? "" : ""); + } else if (helper.isSubtype(argumentType, Id.class)) { + attributeClass = SingularAttribute.class; + // TODO: real paramerer type + otherTypeParams = "? extends " + importType(EntityRepresentation.class) + ""; } else { Elements elements = helper.elementUtils; Types types = helper.typeUtils; @@ -146,10 +151,25 @@ public Iterable apply(Helpers.EnvDependent helper, ConstructorsAsJpaProj } String elementType = containedType(argument); - if (isEntity || isId) { - elementType = importType(EntityRepresentation.class); + if (elementType.startsWith(Id.class.getName())) { + elementType = containedType(elementType); + } /*else { + elementType = containedType(Helpers.typeMirror2QualifiedName.apply(find(new Predicate() { + @Override + public boolean accept(TypeMirror candidate) { + return helper.isSameType(candidate, Id.class); + } + }, types.directSupertypes(elements.getTypeElement(containedType(elementType)).asType())).get())); + }*/ + if (isEntity) { + elementType = elementType.startsWith("?") ? elementType : "? super " + elementType; + elementType = "? extends " + importType(EntityRepresentation.class) + "<" + importTypes(elementType) + ">"; + } else if (isId) { + // TODO: real parameter type + elementType = "? extends " + importType(EntityRepresentation.class) + ""; + } else { + elementType = elementType.startsWith("?") ? importTypes(elementType) : "? extends " + importTypes(elementType); } - elementType = elementType.startsWith("?") ? elementType : "? extends " + elementType; if (isExactlyCollection) { otherTypeParams = "? extends " + importType(Collection.class) + "<" + elementType + ">, " + elementType; diff --git a/src/main/java/fi/solita/utils/query/projection/Project.java b/src/main/java/fi/solita/utils/query/projection/Project.java index 360d557..4e7d48c 100644 --- a/src/main/java/fi/solita/utils/query/projection/Project.java +++ b/src/main/java/fi/solita/utils/query/projection/Project.java @@ -51,137 +51,137 @@ public List getIndexesOfIdWrappingParameters() { }; } - public static > MetaJpaConstructor,Id> id() { + public static & Identifiable> MetaJpaConstructor,Id> id() { return Constructors.id(); } - public static MetaJpaConstructor value(SingularAttribute attribute) { + public static MetaJpaConstructor value(SingularAttribute attribute) { checkOptionalAttributes(attribute); return Constructors.value(attribute); } - public static MetaJpaConstructor value(PluralAttribute attribute) { + public static MetaJpaConstructor value(PluralAttribute attribute) { checkOptionalAttributes(attribute); return Constructors.value(attribute); } - public static MetaJpaConstructor,Map.Entry> pair(Attribute left, Attribute right) { + public static MetaJpaConstructor,Map.Entry> pair(Attribute left, Attribute right) { checkOptionalAttributes(left); checkOptionalAttributes(right); return Constructors.pair(left, right); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple1> tuple(Attribute t1) { + public static MetaJpaConstructor,Tuple1> tuple(Attribute t1) { return makeTuple(t1); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple2> tuple(Attribute t1, Attribute t2) { + public static MetaJpaConstructor,Tuple2> tuple(Attribute t1, Attribute t2) { return makeTuple(t1, t2); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple3> tuple(Attribute t1, Attribute t2, Attribute t3) { + public static MetaJpaConstructor,Tuple3> tuple(Attribute t1, Attribute t2, Attribute t3) { return makeTuple(t1, t2, t3); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple4> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4) { + public static MetaJpaConstructor,Tuple4> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4) { return makeTuple(t1, t2, t3, t4); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple5> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5) { + public static MetaJpaConstructor,Tuple5> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5) { return makeTuple(t1, t2, t3, t4, t5); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple6> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6) { + public static MetaJpaConstructor,Tuple6> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6) { return makeTuple(t1, t2, t3, t4, t5, t6); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple7> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7) { + public static MetaJpaConstructor,Tuple7> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7) { return makeTuple(t1, t2, t3, t4, t5, t6, t7); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple8> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8) { + public static MetaJpaConstructor,Tuple8> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8) { return makeTuple(t1, t2, t3, t4, t5, t6, t7, t8); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple9> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9) { + public static MetaJpaConstructor,Tuple9> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9) { return makeTuple(t1, t2, t3, t4, t5, t6, t7, t8, t9); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple10> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10) { + public static MetaJpaConstructor,Tuple10> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10) { return makeTuple(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple11> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11) { + public static MetaJpaConstructor,Tuple11> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11) { return makeTuple(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple12> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12) { + public static MetaJpaConstructor,Tuple12> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12) { return makeTuple(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple13> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13) { + public static MetaJpaConstructor,Tuple13> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13) { return makeTuple(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple14> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14) { + public static MetaJpaConstructor,Tuple14> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14) { return makeTuple(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple15> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15) { + public static MetaJpaConstructor,Tuple15> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15) { return makeTuple(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple16> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15, Attribute t16) { + public static MetaJpaConstructor,Tuple16> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15, Attribute t16) { return makeTuple(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple17> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15, Attribute t16, Attribute t17) { + public static MetaJpaConstructor,Tuple17> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15, Attribute t16, Attribute t17) { return makeTuple(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple18> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15, Attribute t16, Attribute t17, Attribute t18) { + public static MetaJpaConstructor,Tuple18> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15, Attribute t16, Attribute t17, Attribute t18) { return makeTuple(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple19> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15, Attribute t16, Attribute t17, Attribute t18, Attribute t19) { + public static MetaJpaConstructor,Tuple19> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15, Attribute t16, Attribute t17, Attribute t18, Attribute t19) { return makeTuple(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple20> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15, Attribute t16, Attribute t17, Attribute t18, Attribute t19, Attribute t20) { + public static MetaJpaConstructor,Tuple20> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15, Attribute t16, Attribute t17, Attribute t18, Attribute t19, Attribute t20) { return makeTuple(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple21> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15, Attribute t16, Attribute t17, Attribute t18, Attribute t19, Attribute t20, Attribute t21) { + public static MetaJpaConstructor,Tuple21> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15, Attribute t16, Attribute t17, Attribute t18, Attribute t19, Attribute t20, Attribute t21) { return makeTuple(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20, t21); } @SuppressWarnings("unchecked") - public static MetaJpaConstructor,Tuple22> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15, Attribute t16, Attribute t17, Attribute t18, Attribute t19, Attribute t20, Attribute t21, Attribute t22) { + public static MetaJpaConstructor,Tuple22> tuple(Attribute t1, Attribute t2, Attribute t3, Attribute t4, Attribute t5, Attribute t6, Attribute t7, Attribute t8, Attribute t9, Attribute t10, Attribute t11, Attribute t12, Attribute t13, Attribute t14, Attribute t15, Attribute t16, Attribute t17, Attribute t18, Attribute t19, Attribute t20, Attribute t21, Attribute t22) { return makeTuple(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20, t21, t22); } - private static MetaJpaConstructor makeTuple(Attribute... attributes) { + private static MetaJpaConstructor makeTuple(Attribute... attributes) { for (Attribute a: attributes) { checkOptionalAttributes(a); } diff --git a/src/main/java/fi/solita/utils/query/projection/ProjectionHelper.java b/src/main/java/fi/solita/utils/query/projection/ProjectionHelper.java index 028154f..1c96093 100644 --- a/src/main/java/fi/solita/utils/query/projection/ProjectionHelper.java +++ b/src/main/java/fi/solita/utils/query/projection/ProjectionHelper.java @@ -130,7 +130,7 @@ private Selection transformSelectionForQuery(Attribute param, boolea logger.info("PseudoAttribute detected: {}", pseudo); Expression s = pseudo.getSelectionForQuery(em.apply(), selection); doRestrictions(selection, param); // to restrict e.g. SelfAttribute, if so wanted. - return unwrap(AdditionalQueryPerformingAttribute.class, param).isDefined() || constructorExpectsId && IEntity.class.isAssignableFrom(s.getJavaType()) ? ((Path)s).get(id((Class)s.getJavaType(), em.apply())) : s; + return unwrap(AdditionalQueryPerformingAttribute.class, param).isDefined() || constructorExpectsId && IEntity.class.isAssignableFrom(s.getJavaType()) ? ((Path>)s).get(id((Class>)s.getJavaType(), em.apply())) : s; } if (unwrap(AdditionalQueryPerformingAttribute.class, param).isDefined()) { @@ -174,11 +174,11 @@ Iterable performAdditionalQueriesForPlaceholderValues(MetaJpaConstructor Iterable ret = values; if (shouldPerformAdditionalQuery(attr)) { - List> ids = (List>)(Object)newList(values); + List>> ids = (List>>)(Object)newList(values); if (!ids.isEmpty()) { logger.info("Preforming additional query for Attribute: {}", attr); Class projectionType = projection.getConstructorParameterTypes().get(index); - List r = doAdditionalQuery(projectionType, (Attribute)attr, isId(projectionType), isWrapperOfIds(projection, index), isDistinctable(projection, index), ids); + List r = doAdditionalQuery(projectionType, (Attribute,?>)attr, isId(projectionType), isWrapperOfIds(projection, index), isDistinctable(projection, index), ids); ret = r; if (r.size() != ids.size()) { throw new RuntimeException("Whoops, a bug"); @@ -190,7 +190,7 @@ Iterable performAdditionalQueriesForPlaceholderValues(MetaJpaConstructor return ret; } - private List doAdditionalQuery(Class projectionType, Attribute attr, boolean isId, boolean isWrapperOfIds, boolean isDistinctable, Iterable> sourceIdsToQuery) { + private > List doAdditionalQuery(Class projectionType, Attribute attr, boolean isId, boolean isWrapperOfIds, boolean isDistinctable, Iterable> sourceIdsToQuery) { logger.debug("doAdditionalQuery({},{},{},{},{},{})", new Object[] {projectionType, attr, isId, isWrapperOfIds, isDistinctable, sourceIdsToQuery}); final Map> targetQueryResults = queryTargetsOfSources(attr, isId, isWrapperOfIds, isDistinctable, sourceIdsToQuery); @@ -205,7 +205,7 @@ public List transform(Object source) { return ret; } - private Map,List> queryTargetsOfSources(final Attribute target, boolean isId, boolean isWrapperOfIds, boolean isDistinctable, Iterable> sourceIds) { + private > Map,List> queryTargetsOfSources(final Attribute target, boolean isId, boolean isWrapperOfIds, boolean isDistinctable, Iterable> sourceIds) { logger.debug("queryTargetsOfSources({},{},{},{},{})", new Object[] {target, isId, isWrapperOfIds, isDistinctable, sourceIds}); Collection results = queryTargets(target, isId, isWrapperOfIds, isDistinctable, sourceIds); @@ -257,7 +257,7 @@ public Object transform(Iterable source) { } @SuppressWarnings("unchecked") - private Collection queryTargets(Attribute target, boolean isId, boolean isWrapperOfIds, boolean isDistinctable, Iterable sourceIds) { + private , SOURCE_ID,R> Collection queryTargets(Attribute target, boolean isId, boolean isWrapperOfIds, boolean isDistinctable, Iterable sourceIds) { logger.debug("queryTargets({},{},{},{},{})", new Object[] {sourceIds, target, isId, isWrapperOfIds, isDistinctable}); Class sourceClass = target.getDeclaringType() != null ? target.getDeclaringType().getJavaType() : ((Id)head(sourceIds)).getOwningClass(); CriteriaQuery query = em.apply().getCriteriaBuilder().createQuery(Object[].class); diff --git a/src/main/java/fi/solita/utils/query/projection/ProjectionResultUtil.java b/src/main/java/fi/solita/utils/query/projection/ProjectionResultUtil.java index 5c1611e..6e4f9f0 100644 --- a/src/main/java/fi/solita/utils/query/projection/ProjectionResultUtil.java +++ b/src/main/java/fi/solita/utils/query/projection/ProjectionResultUtil.java @@ -28,6 +28,7 @@ import java.util.TreeSet; import javax.persistence.metamodel.Attribute; +import javax.persistence.metamodel.Bindable; import javax.persistence.metamodel.SingularAttribute; import org.slf4j.Logger; @@ -159,7 +160,13 @@ static Object transformPseudoResultToActualValue(Attribute attribute, Objec static Object wrapNullsToOptionsWhereAppropriate(Attribute attribute, Object resultFromDb) { logger.debug("wrapNullsToOptionsWhereAppropriate({},{})", attribute, resultFromDb); Object ret; - if (attribute.isCollection() || isRequiredByQueryAttribute(attribute)) { + if (attribute.isCollection()) { + if (!(resultFromDb instanceof Collection) && isOption(attribute)) { + ret = Option.of(resultFromDb); + } else { + ret = resultFromDb; + } + } else if (isRequiredByQueryAttribute(attribute)) { ret = resultFromDb; } else { ret = Option.of(resultFromDb); @@ -183,12 +190,23 @@ static Object convertNullsToEmbeddableWhereRequired(Attribute attribute, Ob return ret; } + static boolean isOption(Attribute attr) { + if (attr instanceof Bindable) { + Class b = ((Bindable) attr).getBindableJavaType(); + return b != null && Option.class.isAssignableFrom(b); + } + return false; + } + /** * Removes all Option.None, and unwrap Option.Some from collections */ static Object removeNonesAndSomesFromCollections(Attribute attribute, Object resultFromDb) { logger.debug("removeNonesAndSomesFromCollections({},{})", attribute, resultFromDb); Object ret; + if (isOption(attribute)) { + return resultFromDb; + } if (resultFromDb instanceof List) { ret = newList(map(optionGet, filter(not(isNoneOrNull), (Collection)resultFromDb))); } else if (resultFromDb instanceof SortedSet) { diff --git a/src/main/java/fi/solita/utils/query/projection/Select.java b/src/main/java/fi/solita/utils/query/projection/Select.java index dfceff5..eb81fe0 100644 --- a/src/main/java/fi/solita/utils/query/projection/Select.java +++ b/src/main/java/fi/solita/utils/query/projection/Select.java @@ -17,7 +17,7 @@ public abstract class Select { /** * Include the whole entity itself in the projection (instead of an attribute of it) */ - public static SingularAttribute self() { + public static > SingularAttribute self() { return PseudoAttribute.Constructors.self(); } diff --git a/src/test/java/fi/solita/utils/query/Department.java b/src/test/java/fi/solita/utils/query/Department.java index 4570d4c..b2adc50 100644 --- a/src/test/java/fi/solita/utils/query/Department.java +++ b/src/test/java/fi/solita/utils/query/Department.java @@ -19,7 +19,7 @@ @javax.persistence.Entity @Access(javax.persistence.AccessType.FIELD) -public class Department implements IEntity, Identifiable, Removable { +public class Department implements IEntity, Identifiable, Removable { @Embeddable public static class ID extends LongId { diff --git a/src/test/java/fi/solita/utils/query/Dto.java b/src/test/java/fi/solita/utils/query/Dto.java index b1bdaf0..321267a 100644 --- a/src/test/java/fi/solita/utils/query/Dto.java +++ b/src/test/java/fi/solita/utils/query/Dto.java @@ -37,7 +37,7 @@ public Dto(ID _, Id id) { public Dto(VALUE _, Object val) { this.value = val; } - public Dto(ENTITY _, IEntity val) { + public Dto(ENTITY _, IEntity val) { this.value = val; } public Dto(EMBEDDABLE _, Report val) { @@ -46,7 +46,7 @@ public Dto(EMBEDDABLE _, Report val) { public Dto(OPTIONAL_ID _, Option> val) { this.value = val; } - public Dto(OPTIONAL_ENTITY _, Option val) { + public Dto(OPTIONAL_ENTITY _, Option> val) { this.value = val; } public Dto(OPTIONAL_VALUE _, Option val) { @@ -61,7 +61,7 @@ public Dto(COLLECTION_OF_IDS _, Collection> val) { public Dto(COLLECTION_OF_VALUES _, Collection val) { this.value = val; } - public Dto(COLLECTION_OF_ENTITIES _, Collection val) { + public Dto(COLLECTION_OF_ENTITIES _, Collection> val) { this.value = val; } public Dto(COLLECTION_OF_EMBEDDABLES _, Collection val) { @@ -73,7 +73,7 @@ public Dto(SET_OF_IDS _, Set> val) { public Dto(SET_OF_VALUES _, Set val) { this.value = val; } - public Dto(SET_OF_ENTITIES _, Set val) { + public Dto(SET_OF_ENTITIES _, Set> val) { this.value = val; } public Dto(SET_OF_EMBEDDABLES _, Set val) { @@ -85,7 +85,7 @@ public Dto(LIST_OF_IDS _, List> val) { public Dto(LIST_OF_VALUES _, List val) { this.value = val; } - public Dto(LIST_OF_ENTITIES _, List val) { + public Dto(LIST_OF_ENTITIES _, List> val) { this.value = val; } public Dto(LIST_OF_EMBEDDABLES _, List val) { diff --git a/src/test/java/fi/solita/utils/query/Employee.java b/src/test/java/fi/solita/utils/query/Employee.java index 14591dc..6370266 100644 --- a/src/test/java/fi/solita/utils/query/Employee.java +++ b/src/test/java/fi/solita/utils/query/Employee.java @@ -17,7 +17,7 @@ @javax.persistence.Entity @Access(javax.persistence.AccessType.FIELD) -public class Employee implements IEntity, Identifiable { +public class Employee implements IEntity, Identifiable { @Embeddable public static class ID extends LongId { diff --git a/src/test/java/fi/solita/utils/query/GeneratorTest.java b/src/test/java/fi/solita/utils/query/GeneratorTest.java index c4daeaf..eedc2cc 100644 --- a/src/test/java/fi/solita/utils/query/GeneratorTest.java +++ b/src/test/java/fi/solita/utils/query/GeneratorTest.java @@ -10,9 +10,12 @@ import fi.solita.utils.query._.C; import fi.solita.utils.query._.D; import fi.solita.utils.query._.E; +import fi.solita.utils.query._.F; +import fi.solita.utils.query._.G; +import fi.solita.utils.query._.H; import fi.solita.utils.query.projection.Select; -class Foo implements IEntity { +class Foo implements IEntity { } class FooId implements Id { @@ -28,6 +31,9 @@ enum B {_} enum C {_} enum D {_} enum E {_} + enum F {_} + enum G {_} + enum H {_} } class FooDto { @@ -41,6 +47,12 @@ public FooDto(_.D _, Option a) { } public FooDto(_.E _, Option> a) { } + public FooDto(_.F _, Foo a) { + } + public FooDto(_.G _, Option a) { + } + public FooDto(_.H _, Option a) { + } } public class GeneratorTest { @@ -52,5 +64,8 @@ public void generatedConstructorAcceptsIdRegardlessOfWhetherUsingInterfaceOrConc FooDto_.c3(Select.literal(C._), Select.literal(Some(new Foo()))); FooDto_.c4(Select.literal(D._), Select.literal(Some(new Foo()))); FooDto_.c5(Select.literal(E._), Select.literal(Some(new Foo()))); + FooDto_.c6(Select.literal(F._), Select.literal(new Foo())); + FooDto_.c7(Select.literal(G._), Select.literal(Some(new Foo()))); + FooDto_.c8(Select.literal(H._), Select.literal(Some(new Foo()))); } } diff --git a/src/test/java/fi/solita/utils/query/Municipality.java b/src/test/java/fi/solita/utils/query/Municipality.java index c044c70..c3e5f71 100644 --- a/src/test/java/fi/solita/utils/query/Municipality.java +++ b/src/test/java/fi/solita/utils/query/Municipality.java @@ -21,7 +21,7 @@ @Entity @Access(AccessType.FIELD) -public class Municipality implements IEntity, Identifiable { +public class Municipality implements IEntity, Identifiable { @Embeddable public static class ID extends LongId { diff --git a/src/test/java/fi/solita/utils/query/QueryTestBase.java b/src/test/java/fi/solita/utils/query/QueryTestBase.java index 5fe617d..3c4f5d6 100644 --- a/src/test/java/fi/solita/utils/query/QueryTestBase.java +++ b/src/test/java/fi/solita/utils/query/QueryTestBase.java @@ -18,8 +18,8 @@ public abstract class QueryTestBase { @PersistenceContext protected EntityManager em; - protected void persist(IEntity... entities) { - for (IEntity e: entities) { + protected void persist(IEntity... entities) { + for (IEntity e: entities) { em.persist(e); } }