Tengo un problema con consulta de hibernate.

ACTUALIZACIÓN:
Cuando yo uso esta consulta funciona como un encanto:

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

Pero cuando yo uso una que se enumeran a continuación, para seleccionar solo resultado (como la de inicio de sesión)…

Me sale este error: ADVERTENCIA: Error de SQL: 1064, SQLState: 42000

He intentado variedad de formas de implementar esta consulta, pero sin éxito. Voy a la lista de ellos en el final del post.

Este es el código:

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;

Incluso si reemplazar :ime y :lozinka con datos reales como «k.korisnickoIme=’msbtest’ y k.lozinka = ‘msbtest'» me sale el mismo error.

Su ayuda es muy apreciada.

Gracias!

De la pila completa:

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

asignación es como sigue:

/**
** 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;

y getters y setters ir…

OK, mi persistence.xml el archivo se parece a esto:

<?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>

OK, ¿y ahora qué???

  • Puede agregar seguimiento completo de la pila para el post también las entidades y su asignación?
  • Lo he añadido. si usted necesita más hágamelo saber… gracias!
  • El punto es que el TOP(?) korisnik0_.KorisnikID as KorisnikID11_ en su consulta. Así que.. ¿qué tipo de base de datos se utilizan? Puede que nos muestran su hibernación config?
  • <propiedad nombre=»javax.la persistencia.jdbc.conductor de» valor=»com.mysql.jdbc.Driver» />
  • Oh, en lugar de responder aquí, voy a editar mi post…
  • Ver mi respuesta, su hibernación.dialecto es el mal…
  • Y la base de datos: Base de datos del servidor: localhost a través de TCP/IP Software: MySQL versión de Software: 5.5.25 una Comunidad de MySQL Server (GPL) versión de Protocolo: 10 Usuario: xxxxxxxxx Servidor charset: UTF-8 Unicode (utf8)
  • SI o HCI mi amigo? 😉

InformationsquelleAutor Blejzer | 2013-07-05

2 Comentarios

  1. 3

    El resultado de la consulta de dar sugiere que usted dijo de Hibernación para generar SQL para MS-SQL Server (mediante TOP(1) a buscar la fila superior).

    Ya que usted está utilizando una base de datos mysql como backend, que no funcionan. Trate de añadir

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

    a su persistence.xml o dondequiera que usted configure JPA.

    Como @Secko menciona en el comentario, omitiendo el dialecto del todo incluso podría seleccionar un mejor (más específicos) uno.

    • Esto era tan evidente que me podría haber pasado la eternidad mirando y todavía falta. Supongo que este es uno de esos errores de principiante??? Funciona a la perfección. Muchas gracias!!!
    • Todos tenemos esos momentos. Eres bienvenido!
    • +1 en Realidad es org.hibernate.dialecto.MySQLDialect y org.hibernate.dialecto.MySQL5Dialect para la versión 5 de lo contrario, causa más problemas. JPA debe interactuar con el servidor de sí mismo y reconocer el dialecto de la versión y si dialecto propiedad no se incluye. Espero que esto ayude a alguien.
    • Gracias por decírmelo. Ha sido un tiempo desde la última vez que miró a la disposición de los dialectos y parece que creció un poco de subclases. Probablemente no hay ningún punto en la especificación de Mysql5InnoDBDialect si Hibernate puede detectar automáticamente esta.
    • Verdadero. Una cosa más, otro problema se produce cuando se define un dialecto y de hibernación detecta otro. Todo se compila y se ejecuta bien, pero luego de consultas SQL fallar por ninguna razón. Es difícil detectar este si usted no sabe lo que hibernate hace.
  2. 1

    Este error suele indicar algunos errores de asignación. Son todos los campos que se utilizan en la donde son en realidad campos de la «Korisnik» de la clase? HQL utiliza los nombres de campo y no los nombres de las columnas de la base de datos.

    • Esto es lo que Korisnik clase:
    • … privada Entero KorisnikID; private String ime; private String prezime; private String kontakt; private String korisnickoIme; private String lozinka; private Boolean isActive; …
    • Así, los nombres de campo se korisnickoIme y lozinka…
    • No todos los nombres de columna que coincida con los nombres de campo? Trate de añadir @Column(name = «…»).
    • Me puedes dar ejemplo, no estoy seguro de cómo hacerlo?
    • Tengo el mismo SQL Error: 1064, SQLState: 42000 mensaje porque escribí mal el nombre de una columna.

Dejar respuesta

Please enter your comment!
Please enter your name here