2016-07-13 9 views
0

Ich habe ein Problem mit der Abfrageausführung.Spring Data keine Abfrage ausführen

meine Struktur hier:

Product

@Data 
@Entity 
@Table(name="\"Product_price\"") 
public class ProductPrice { 
    @Id 
    @SequenceGenerator(name="product_price_id_seq", 
      sequenceName="product_price_id_seq", 
      allocationSize=1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, 
      generator="product_price_id_seq") 
    private long id; 
    private Float price; 
    private Date date_from; 
    @ManyToOne 
    private Product product; 
} 

Hier ist meine ProductPriceDto

@Data 
public class ProductPriceDto implements Serializable { 
    public Float price; 
    public Date date; 
} 

Hier ist meine PriceRepository

public interface PriceRepository extends CrudRepository<ProductPrice, Long> { 
    public static final String FIND_LAST_PRICE = "SELECT p.price, MAX(p.date_from) FROM ProductPrice p WHERE p.product = ?1 GROUP BY p.product"; 

    @Query(FIND_LAST_PRICE) 
    ProductPriceDto findPrice(@Param(value = "product") Long product); 

    @Override 
    List<ProductPrice> findAll(); 
} 

Nun, wenn ich findPrice auf PriceRepository auszuführen versuche, erhalte ich einen Fehler von:

java.lang.IllegalArgumentException: Parameter value [1] did not match expected type [com.eternity.model.Product (n/a)]]

Was mache ich falsch?

EDIT

Trotz der guten Antworten, die ich von Wim erhalten haben, decied ich mit gehen:

ProductPrice findFirstByProductIdOrderByDateFromDesc(@Param(value = "product") Long product); 

Antwort

3

Ihre Abfragemethode eine Long als Methode Argument erwartet, aber in Ihrem JPQL Abfrage , Sie möchten eine Product.

Ändern Sie das Abfragemethodenargument in Product.

+0

Das hat gut funktioniert, aber zu einer neuen Ausgabe führen: SQLGrammarException: ResultSet nicht extrahieren konnte] mit Ursache org.postgresql.util.PSQLException: ERROR : Spalte "productpri0_.price" muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden :( – uksz

+0

@uksz möchten Sie vielleicht eine separate Frage dazu stellen. –

+0

Ich denke, es liegt daran, dass Sie ein '@ ManyToOne' haben Beziehung für diese Eigenschaft, so bedeutet dies, dass Sie viele "Preis" Ergebnisse für ein einzelnes "Produkt" haben – ddb

1

ProductPrice Modellklasse hat eine Product product Eigenschaft, keine Long product, aus diesem Grund haben Sie diesen Fehler.

sollten Sie Ihre PriceRepository hat ändern unter

public interface PriceRepository extends CrudRepository<ProductPrice, Long> { 
    public static final String FIND_LAST_PRICE = "SELECT p.price, MAX(p.date_from) FROM ProductPrice p WHERE p.product = ?1 GROUP BY p.product"; 

    @Query(FIND_LAST_PRICE) 
    List<ProductPrice> findPrice(@Param(value = "product") Product product); 

    @Override 
    List<ProductPrice> findAll(); 
} 
Verwandte Themen