[
https://issues.apache.org/jira/browse/DELTASPIKE-699?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Radu Creanga updated DELTASPIKE-699:
------------------------------------
Attachment: DELTASPIKE-699.patch
The problem described is not related only to the attribute() method, but also
to all other methods of the CriteriaSupport interface which take
SingularAttribute as parameter. Therefore, the attached patch relaxes the
generic constraints on all the methods.
> Signature relaxing of attribute method() in CriteriaSupport
> -----------------------------------------------------------
>
> Key: DELTASPIKE-699
> URL: https://issues.apache.org/jira/browse/DELTASPIKE-699
> Project: DeltaSpike
> Issue Type: Improvement
> Components: Data-Module
> Affects Versions: 1.0.0
> Reporter: Radu Creanga
> Attachments: DELTASPIKE-699.patch
>
>
> Suppose one has an entity class hierarchy, such as when moving auditing
> fields into a mapped superclass.
> @MappedSuperclass
> @EntityListeners(AuditEntityListener.class)
> public abstract class Auditable implements Serializable {
> @CreatedOn
> @Temporal(TemporalType.TIMESTAMP)
> private Date created;
> @ModifiedOn
> @Temporal(TemporalType.TIMESTAMP)
> private Date modified;
> // getters, setters
> }
> @Entity
> public class Item extends Auditable {
> @Id
> private Long id;
> @Basic
> private String name;
> // getters, setters
> }
> Then an metamodel processor would generate the following metamodel classes:
> @StaticMetamodel(Auditable.class)
> public abstract class Auditable_ {
> public static volatile SingularAttribute<Auditable, Date> created;
> public static volatile SingularAttribute<Auditable, Date> modified;
> }
> @StaticMetamodel(Item.class)
> public abstract class Item_ extends
> com.mobilabsolutions.nappkin.web.dto.Auditable_ {
> public static volatile SingularAttribute<Item, Long> id;
> public static volatile SingularAttribute<Item, String> name;
> }
> For the sake of completeness, here's the repository declaration with criteria
> support:
> @Repository
> public interface ItemRepository extends EntityRepository<Item, Long>,
> CriteriaSupport<Item> {
> }
> Then, if one wants to do the following:
> @Inject
> private ItemRepository itemRepository;
> public void someMethod() {
> this.itemRepository.criteria().select(
> this.itemRepository.attribute(Item_.name),
> this.itemRepository.attribute(Item_.modified));
> }
> the source won't compile, because the declaration of the attribute() method
> in CriteriaSupport:
> public interface CriteriaSupport<E>
> {
> ...
> /**
> * Create a query selection for an Entity attribute.
> * @param attribute Attribute to show up in the result selection
> * @return {@link QuerySelection} part of a {@link
> Criteria#select(Class, QuerySelection...)} call.
> */
> <X> QuerySelection<E, X> attribute(SingularAttribute<E, X> attribute);
> ...
> }
> Should change the method signature to:
> <X> QuerySelection<E, X> attribute(SingularAttribute<? super E, X> attribute);
> The mapped superclass doesn't have to have anything to do with auditing, but
> that's the example that came to mind.
--
This message was sent by Atlassian JIRA
(v6.2#6252)