Details
-
Improvement
-
Status: Closed
-
Major
-
Resolution: Fixed
-
1.0.0
-
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
@Entity
public class Item extends Auditable
Then an metamodel processor would generate the following metamodel classes:
@StaticMetamodel(Auditable.class)
public abstract class Auditable_
@StaticMetamodel(Item.class)
public abstract class Item_ extends com.mobilabsolutions.nappkin.web.dto.Auditable_
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.