You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltaspike.apache.org by "Radu Creanga (JIRA)" <ji...@apache.org> on 2014/08/26 12:57:57 UTC

[jira] [Created] (DELTASPIKE-699) Signature relaxing of attribute method() in CriteriaSupport

Radu Creanga created DELTASPIKE-699:
---------------------------------------

             Summary: 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


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)