2016-07-29 62 views
1

我想收到从我的抽象类扩展的所有记录。我有以下几点:如何返回从存储库中扩展类的多个类?

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类的子类的项目?

UPDATE:

我已经添加下面的方法到ProductRepository

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

,并在控制器改变它 - 这是正确的方式做到这一点?

,我已经使用这个错误是:

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

回答

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

编辑:虚假言论删除。

+0

为什么我不使用表名?我使用TABLE_PER_CLASS策略... – uksz

+0

哦,我很抱歉,我读了。但是,你不应该使用'@ SecondaryTable'注解吗?看看http://stackoverflow.com/q/3915026/6505091 – kaba713