2013-07-05 86 views
2

我有一個hibernate查詢的問題。警告:SQL錯誤:1064,SQLState:42000

UPDATE: 當我使用此查詢它就像一個魅力:

public static List<Korisnik> UzmiSveKorisnike() 
    { 
     EntityManager em = Konekcija.getEmf().createEntityManager(); 

     TypedQuery<Korisnik> q = em.createQuery("select k from Korisnik k where k.isActive = 1", Korisnik.class); 
     List<Korisnik> resultList = q.getResultList(); 

     em.close(); 
     return resultList; 
    } 

但是,當我用一個下面列出,選擇一個結果(如用於登錄)...

我得到這個錯誤:警告:SQL錯誤:1064,SQLState:42000

我已經嘗試了多種方法來實現此查詢,但沒有成功。我將在帖子末尾列出他們。

這是代碼:

public static Korisnik ProvjeraKorisnickihPodataka(String kIme, String kLozinka) 
    { 
     EntityManager em = Konekcija.getEmf().createEntityManager(); 

    { 
     TypedQuery<Korisnik> q = em.createQuery("select k from Korisnik k where k.isActive = 1 AND k.korisnickoIme=:ime AND k.lozinka =:lozinka", Korisnik.class); 
     q.setParameter("ime", kIme); 
     q.setParameter("lozinka", kLozinka); 
     Korisnik provjeren = q.getSingleResult(); 

     em.close(); 

     return provjeren; 

即使我更換:IME和:lozinka包含 「k.korisnickoIme = 'msbtest' 和k.lozinka = 'msbtest'」 我得到相同的實際數據錯誤。

您的幫助表示讚賞。

謝謝!

完整的堆棧:

Hibernate: select TOP(?) korisnik0_.KorisnikID as KorisnikID11_, korisnik0_.agencija_AgencijaID as agencija8_11_, korisnik0_.ime as ime11_, korisnik0_.isActive as isActive11_, korisnik0_.kontakt as kontakt11_, korisnik0_.korisnickoIme as korisnic5_11_, korisnik0_.lozinka as lozinka11_, korisnik0_.prezime as prezime11_, korisnik0_.rola_RolaID as rola9_11_ from Korisnik korisnik0_ where korisnik0_.isActive=1 and korisnik0_.korisnickoIme=? and korisnik0_.lozinka=? 
Jul 05, 2013 11:45:22 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
WARN: SQL Error: 1064, SQLState: 42000 
Jul 05, 2013 11:45:22 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.KorisnikID as KorisnikID11_, korisnik0_.agencija_AgencijaID as agencija8_11_, k' at line 1 
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.KorisnikID as KorisnikID11_, korisnik0_.agencija_AgencijaID as agencija8_11_, k' at line 1 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1377) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300) 
    at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:318) 
    at Servis.LoginServis.ProvjeraKorisnickihPodataka(LoginServis.java:35) 
    at UI.LogInFrm.do_btnPrijava_widgetSelected(LogInFrm.java:173) 
    at UI.LogInFrm$1.widgetSelected(LogInFrm.java:121) 
    at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source) 
    at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source) 
    at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source) 
    at UI.LogInFrm.main(LogInFrm.java:44) 
Caused by: org.hibernate.exception.SQLGrammarException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.KorisnikID as KorisnikID11_, korisnik0_.agencija_AgencijaID as agencija8_11_, k' at line 1 
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82) 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 
    at com.sun.proxy.$Proxy10.executeQuery(Unknown Source) 
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1926) 
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1727) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:852) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:293) 
    at org.hibernate.loader.Loader.doList(Loader.java:2411) 
    at org.hibernate.loader.Loader.doList(Loader.java:2397) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2227) 
    at org.hibernate.loader.Loader.list(Loader.java:2222) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195) 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1247) 
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101) 
    at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:285) 
    ... 9 more 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.KorisnikID as KorisnikID11_, korisnik0_.agencija_AgencijaID as agencija8_11_, k' at line 1 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.Util.getInstance(Util.java:386) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) 
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2322) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122) 
    ... 25 more 

映射是這樣的:

/** 
** Class Korisnik 
**/ 
    @Entity 
public class Korisnik implements Serializable { 
    //Fields 
    @Id 
    @GeneratedValue 
    private Integer KorisnikID; 
    private String ime; 
    private String prezime; 
    private String kontakt; 
    private String korisnickoIme; 
    private String lozinka; 
    private Boolean isActive; 
    @JoinColumn(nullable = false) 
    @ManyToOne 
    private Agencija agencija; 
    @JoinColumn(nullable = false) 
    @ManyToOne 
    private Rola rola; 

和getter和setter方法去...

OK,我的persistence.xml文件看起來像這樣:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="MojaOznaka1" transaction-type="RESOURCE_LOCAL"> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <properties> 
      <!-- Podaci o bazi podataka --> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://xxxxxxxxx.xxxxxxxxx.xxx/xxxxxxxxx/" /> 
      <property name="javax.persistence.jdbc.user" value="xxxxxx" /> 
      <property name="javax.persistence.jdbc.password" value="xxxxxx" /> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 


      <!-- hiberante dialect --> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect" /> 
      <!-- JDBC connection pool (use the built-in) --> 
      <property name="connection.pool_size" value="1" /> 
      <!-- Ispis SQL koda u konzolu --> 
      <property name="hibernate.show_sql" value="true" /> 
      <!-- formatiranje SQL koda ispisanog u konzolni prozor --> 
      <property name="hibernate.format_sql" value="false" /> 
      <!-- Vrijednost "update" kreira tabele ako nepostoje --> 
        <!-- <property name="hibernate.hbm2ddl.auto" value="update" /> --> 
      <!-- Enable Hibernate's automatic session context management --> 
      <property name="current_session_context_class" value="thread" /> 
      <!-- Disable the second-level cache --> 
      <property name="cache.provider_class" value="org.hibernate.cache.NoCacheProvider" /> 
      <!-- automatsko prepoznavanje JPA klasa --> 
      <property name="hibernate.archive.autodetection" value="class, hbm" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

行,現在是什麼?

+0

你可以添加完整的堆棧跟蹤到帖子也實體及其映射? – zerocool

+0

我加了。如果你需要更多的話讓我知道......謝謝! – Blejzer

+0

重點是在您的查詢中將頂部(?)korisnik0_.KorisnikID設置爲KorisnikID11_'。那麼..你使用什麼樣的數據庫?你能告訴我們你的休眠配置嗎? – mabi

回答

3

您提供的查詢輸出建議您告訴Hibernate爲MS-SQL Server生成SQL(使用TOP(1)來獲取最上面一行)。

由於您正在使用mysql數據庫作爲後端,因此無法工作。嘗試將

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

添加到您的persistence.xml或您配置JPA的任何位置。

正如@Secko在評論中提到的,完全省略方言可能甚至會選擇更好(更具體)的方言。

+0

這太明顯了,我可能已經花費了永恆的注意力,並且仍然會想念它。我猜這是其中一個初學者錯誤?它效果很好。非常感謝!!! – Blejzer

+0

我們都有這樣的時刻。別客氣! – mabi

+1

+1其實它是org.hibernate.dialect.MySQLDialect和org.hibernate.dialect.MySQL5Dialect for version 5,否則會導致更多問題。如果方言屬性被忽略,JPA應該與服務器本身進行交互並識別方言和版本。希望這可以幫助某人。 – Secko

1

此錯誤通常指示一些映射錯誤。 「Korisnik」課程中的所有字段都使用了哪些字段? HQL使用字段名稱而不是數據庫中的列名稱。

+0

這是Korisnik類所具有的: – Blejzer

+0

... private Integer KorisnikID; private String ime; 私人字符串prezime; 私人字符串kontakt; private String korisnickoIme; 私人字符串lozinka; private Boolean isActive; ... – Blejzer

+0

因此,字段名稱是korisnickoIme和lozinka ... – Blejzer

相關問題