如何返回从存储库扩展类的多个类?

时间:2016-07-29 10:52:21

标签: java hibernate spring-boot

我想收到从我的抽象类扩展的所有记录。我有以下内容:

Product.java

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(name="descriminatorColumn")
@Table(name="ProductCatalog")
public abstract class Product {
    @Id
    private Long id;
}

PC.java

@Entity
@Table(name = "PC")
public class PC extends Product{
    private String pcType;
}

TV.java

@Entity
@Table(name = "TV")
public class TV extends Product{
    private String tvType;
}

ProductRepository.java

public interface ProductRepository extends CrudRepository<Product, Long> {
    <T extends Product>List<T> findAll(); // not working
}

在我的控制器中我有:

@RequestMapping(value = "/product", method = GET)
public <T extends Product>List<T> findProducts(){
    return productRepository.findAll();
}

如何让findAll()返回扩展类Product的子类中的所有项?

更新

我已将以下方法添加到 ProductRepository

<T extends Product>List<T> findProducts();

并在控制器中更改它 - 这是正确的方法吗?

我使用的错误是:

 Caused by:
 org.springframework.data.mapping.PropertyReferenceException: No
 property findProducts found for type Product!

1 个答案:

答案 0 :(得分:0)

我在我的存储库中以下列方式执行此操作。这是一个通用答案,因此您可以将它用于任何类,甚至是抽象类:

public <T> List<T> findAll(Class<T> type) {
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<T> criteria = builder.createQuery(type);
    Root<T> root = criteria.from(type);     
    CriteriaQuery<T> all = criteria.select(root);
    TypedQuery<T> allQuery = entityManager.createQuery(all);

    return (List<T>) allQuery.getResultList();
}

编辑:删除了错误的评论。