The car class will be inherited by several others, it needs to filter all attributes and method results. Can someone give me a hint how to do this?
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "APP_CAR")
@Entity
public abstract class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String type;
private Double length;
@CreatedBy
private String createdBy;
@CreatedDate
private LocalDateTime createdAt;
public abstract Double averageSpeed();
public abstract Double averageFuelConsumption();
}
What I have tried:
I tried crtieria and QueryDSL
@NamedQuery(
name = "Shape.findByArea",
query = "SELECT s FROM Shape s WHERE s.getArea BETWEEN :minArea AND :maxArea"
)
@NamedQuery(
name = "Shape.findByPerimeter",
query = "SELECT s FROM Shape s WHERE s.getPerimeter BETWEEN :minPerimeter AND :maxPerimeter"
)
public List<Shape> getShapesByArea(double minArea, double maxArea) {
return entityManager.createNamedQuery("Shape.findByArea", Shape.class)
.setParameter("minArea", minArea)
.setParameter("maxArea", maxArea)
.getResultList();
}
public List<Shape> getShapesByPerimeter(double minPerimeter, double maxPerimeter) {
return entityManager.createNamedQuery("Shape.findByPerimeter", Shape.class)
.setParameter("minPerimeter", minPerimeter)
.setParameter("maxPerimeter", maxPerimeter)
.getResultList();
}
public List<Shape> getShapesByArea(double minArea, double maxArea) {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Shape> criteria = builder.createQuery(Shape.class);
Root<Shape> root = criteria.from(Shape.class);
criteria.where(
builder.between(root.get("getArea"), minArea, maxArea)
);
return entityManager.createQuery(criteria).getResultList();
}
public List<Shape> getShapesByPerimeter(double minPerimeter, double maxPerimeter) {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Shape> criteria = builder.createQuery(Shape.class);
Root<Shape> root = criteria.from(Shape.class);
criteria.where(
builder.between(root.get("getPerimeter"), minPerimeter, maxPerimeter)
);
return entityManager.createQuery(criteria).getResultList();
}