2016-07-29 82 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