【问题标题】:How to return multiple classes extending class from repository?如何从存储库返回多个扩展类的类?
【发布时间】:2016-12-04 01:31:27
【问题描述】:

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

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!

【问题讨论】:

    标签: java hibernate spring-boot


    【解决方案1】:

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    相关资源
    最近更新 更多