2016-07-29 1 views
1

Ich möchte alle Datensätze erhalten, die von meiner abstrakten Klasse ausgehen. Ich habe folgendes:Wie gibt man mehrere Klassen zurück, die die Klasse vom Repository erweitern?

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

Und ProductRepository.java

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

In meinem Controller habe ich:

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

Wie kann ich die findAll() Rückkehr alle Elemente aus den Unterklassen machen die Product Klasse erweitern?

UPDATE:

Ich habe die folgende Methode der ProductRepository hinzugefügt:

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

und änderte es in der Steuerung - ist dies der richtige Weg, es zu tun?

Der Fehler, dass ich diese verwendet haben, ist:

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

Antwort

0

ich in meinem Repository es die folgende Art und Weise tun. Ist eine generische Antwort, so dass Sie es für jede Klasse verwenden können, auch Ihre abstrakte Klasse:

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

Bearbeiten: Falsche Bemerkung entfernt.

+0

Warum soll ich Tabellennamen verwenden? Ich benutze die TABLE_PER_CLASS-Strategie ... – uksz

+0

Oh, tut mir leid, dass ich das gelesen habe. Aber sollten Sie dann nicht die '@ SecondaryTable' Annotation verwenden? Werfen Sie einen Blick auf http://stackoverflow.com/q/3915026/6505091 – kaba713

Verwandte Themen