Uploaded image for project: 'DeltaSpike'
  1. DeltaSpike
  2. DELTASPIKE-699

Signature relaxing of attribute method() in CriteriaSupport

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 1.0.0
    • 1.0.3
    • Data-Module
    • None

    Description

      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.

      Attachments

        1. DELTASPIKE-699.patch
          26 kB
          Radu Creanga

        Activity

          People

            thomashug Thomas Hug
            rdcrng Radu Creanga
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: