2017-01-25 2 views
0

Ich bin neu auf Spring-Boot. Ich erstellte eine einfache JPA-App, die web und H2 und JPA Abhängigkeit verwenden. Ich möchte eine eingebettete Datenbank mit h2 haben und JPA verwenden, um sich mit einigen Anfragen zu verbinden.Spring-Boot: JPA-Abfrage (JPQL) funktioniert nicht, funktioniert aber bei Änderung der systemeigenen Abfrage

habe ich die lokale Tabelle in schema.sql und diesen Code setzen:

drop TABLE if EXISTS stock; 
CREATE TABLE stock(stockId INT ,companyName VARCHAR(20),price DECIMAL (10,2) 
); 

INSERT INTO stock VALUES (1,'apple',345.01); 
INSERT INTO stock VALUES (2,'google',8999.00); 
INSERT INTO stock VALUES (3,'kashky',56.60); 

Ich habe auch die Aktie wie folgt aus:

@Entity 
public class Stock { 

    @Id 
    private int stockId; 

    private String companyName; 

    private double price; 

... with all setter and getters 

} 

und das ist mein application.properties

spring.jpa.hibernate.ddl-auto=none 
server.port=9090 

Java Persistence Query Language (JPQL) funktioniert nicht, aber wenn ich in native qu ändern es funktioniert es gut.

dieser Code, der alle meine Aufzeichnungen und nicht funktioniert zurückkehren sollte:

@SpringBootApplication 
@RestController 
public class SpringDataTestApplication { 

    @Autowired 
    private EntityManager em; 

    @RequestMapping("/stocks") 
    public List<Stock> stocks(){ 
     return em.createQuery("select s from Stock s").getResultList(); 
    } 

wenn ich Abfrage auf einheitlichem Modus ändern, ist es funktioniert:

@RequestMapping("/stocks") 
public List<Stock> stocks(){ 
    return em.createNativeQuery("select * from Stock").getResultList(); 
} 

und das ist der Fehler:

This application has no explicit mapping for /error, so you are seeing this as a fallback. 

Wed Jan 25 12:51:38 IRST 2017 
There was an unexpected error (type=Internal Server Error, status=500). 
org.hibernate.exception.SQLGrammarException: could not prepare statement 

Warum das passiert? Ich denke, ich habe ein Problem mit JPA Ursache in später kann ich nicht einmal verwenden StockRepository, dass ich nicht in Code erwähnen, aber ich denke, all dies ist angekettet zu sammeln.

+1

Bitte posten Sie die gesamte Ausnahme stacktrace, nicht nur die Nachricht. Außerdem: Sind das die tatsächlichen Spalten/Klasseneigenschaften, die Sie haben, oder ist dies ein vereinfachtes Beispiel und es gibt mehr?Wenn es mehr gibt: bitte poste sie alle – Gimby

+0

nein, das ist das ganze Beispiel und Dateien. ok ich werde sie aktualisieren – Kenji

Antwort

0

Ich finde endlich die Antwort. Es ist eine ungeschriebene Konvention, die vorhanden sind, und wenn Sie camel-case Eigenschaften verwenden, mussten Sie unter ausgekleidet Felder in schema.sql Datei verwenden.

so mit meiner Entity-Datei wie folgt aus:

@Entity 
public class Stock { 

    @Id 
    private int stockId; 

    private String companyName; 

    private double price; 

... with all setter and getters 

} 

Ich änderte schema.sql wie dieses und Fehler gegangen und es hat gut funktioniert.

drop TABLE if EXISTS stock; 
CREATE TABLE stock(stock_id INT ,company_name VARCHAR(20),price DECIMAL (10,2) 
); 

INSERT INTO stock VALUES (1,'apple',345.01); 
INSERT INTO stock VALUES (2,'google',8999.00); 
INSERT INTO stock VALUES (3,'kashky',56.60); 

Ich überprüfe auch, dass selbst stock_Id und company_Name die JPA Konvention und Arbeiten erfüllen. so müssen Sie nur Underline zwischen Camel-casing Eigenschaften Name setzen.

0

Ich würde vermuten, dass Sie dialekt infos in Ihrer Datei application.properties, z. für den Winterschlaf:

<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> 

Ich denke, der Frühling hat seine eigenen Knöpfe für diese Aufgabe. Wenn Sie den Dialekt kennen, kennt Ihr Programm den "Geschmack" des zu erstellenden SQL. Native SQL funktioniert, da keine Übersetzung durchgeführt werden muss.

Verwandte Themen