Hi all,

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);

    ...

}

Wouldn't it make sense (and possible?) to change it 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.

Best regards,
Radu

Reply via email to