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

関連する問題