2017-10-15 5 views
0

ich einige Probleme in meiner App sqlRestriction Methode haben:Token SQL92 nicht unterstützt

Das ist mein Film Klasse:

public class Movie { 

    @Id 
    @Column(name = "pk") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "movie_seq") 
    @SequenceGenerator(name = "movie_seq", sequenceName = "movie_seq", allocationSize = 1, initialValue = 1) 
    public long id; 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    @Column(name = "name") 
    public String str_name = ""; 

... 

} 

Wenn ich etwas tun, wie dieser (Blindtest):

List<Movie> movies = session.createCriteria(Movie.class) 
     .add(Restrictions.sqlRestriction("1 in (1)")) 
     .list(); 

Es funktioniert perfekt.

Mein zweiter Test (die Einschränkung zu ändern):

.add(Restrictions.sqlRestriction("Movie.id in (166,171)")) 

Und mein dritter Test

add(Restrictions.sqlRestriction("{Movie}.id in (166,171)")) 

Beide auf die gleiche Art und Weise versagt:

ERROR: Token SQL92 no soportado en la posición: 345 
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not extract ResultSet 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47) 
    ... 
Caused by: java.sql.SQLException: Token SQL92 no soportado en la posición: 345 
    at oracle.jdbc.driver.OracleSql.handleODBC(OracleSql.java:1275) 
    ... 

Was bin ich falsch machen?

Edited

Ich habe versucht:

.add(Restrictions.sqlRestriction("{alias}.id in (?, ?)", new Long[]{166L,171L}, new Type[]{Hibernate.Long, Hibernate.Long})) 

Und ich habe dies: "Hibernate {anyType}" "Lange kann nicht aufgelöst werden oder ist kein Feld"

Es scheint, ist veraltet, siehe diesen Link: Why Hibernate STRING can not be resolved?

Ich habe dies stattdessen versucht:

.add(Restrictions.sqlRestriction("{alias}.id in (?, ?)", new Long[]{166L,171L}, new Type[]{LongType.INSTANCE, LongType.INSTANCE})) 

Aber ich habe diesen Fehler:

Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "THIS_"."ID": invalid identifier 
+0

nur neugierig war das neueste mit 'öffentlichen Long-ID' oder' öffentlichen Long-ID'? aber es scheint, dass der Alias ​​nicht korrekt eingestellt ist – pirho

+0

Schließlich wurde der Fehler gerade erkannt.Ich benutzte den Namen der Hibernate-Tabelle/Feldnamen (ich meine "id") es wurde in "pk" geändert. und es hat funktioniert!. .add (Einschränkungen.sqlRestriction ("pk in (?,?)", Neue Long [] {166L, 171L}, neue Art [] {LongType.INSTANCE, LongType.INSTANCE})) Ich dachte, ich habe um die HQL-Tabellen-/Feldnamen zu verwenden. Aber die Namen/Felder der Phisicall-Tabelle sind korrekt! Beantworten Sie Ihre Frage: Ich verwende dies: @Column (name = "pk") öffentliche lange id; Ich schätze sehr Ihre Hilfe – Lev

+0

natürlich. Ich verpasste '@Column (name =" pk ")' und 'sqlRestriction' es ist native sql NICHT JPQL: D. Nun, lernte etwas Neues – pirho

Antwort

0

Nicht sicher, ob Sie den Alias ​​korrekt verwenden. Versuchen folgende

Restrictions.sqlRestriction("{alias}.pk in (?, ?)", new Long[]{166L,171L}, new Type[]{Hibernate.Long, Hibernate.Long})) 

Graf von ? muss auf die gleiche wie die Größe der gegebenen Anordnung so sollte die (?,?) & dynamisch beigefügten konstruiert werden basierend auf der Anordnung übergeben. Sowie die Art Array.

EDIT: der ID-Feldname ist nicht id aber pk, verpasst @Column(name = "pk") in origal Antwort. Neuere Hibernate-Versionen haben keinen "Hibernate.Long" mehr, sondern verwenden stattdessen LongType.INSTANCE.

Restrictions.sqlRestriction("{alias}.pk in (?, ?)", new Long[]{166L,171L}, new Type[]{LongType.INSTANCE, LongType.INSTANCE})) 
+0

Ich habe Ihre Lösung versucht, aber es scheint "Hibernate.Long" ist veraltet. Ich denke, ich muss "LongType.INSTANCE" verwenden. Allerdings habe ich diesen Fehler erhalten: "java.lang.ClassCastException: [J kann nicht in java.lang.Long umgewandelt werden", vielleicht weil es ein Array ist .. Aber wie auch immer. Ich versuchte mit nur einem Wert (kein Array): sqlRestriction ("{alias} .id =?", 166L, LongType.INSTANCE) Und ich habe diesen Fehler: ORA-00904: "THIS _". "ID": ungültig Bezeichner – Lev

+0

hat es funktioniert, auch 'Hibernate.Long' ist veraltet? Wie wäre es dann mit 'Long.class'? – pirho

+0

Entschuldigung, ich habe meinen Kommentar bearbeitet .. Beantworte deinen letzten Kommentar. Ja, es scheitert. "Hibernate.INTEGER kann nicht aufgelöst werden". Von welchem ​​Paket wird es importiert? ¿Importieren org.hibernate.Hibernate? – Lev

0

Gelöst. Ich benutzte den Namen der Hibernate-Tabelle/Feldnamen (ich meine "id") es wurde in "pk" geändert. und es hat funktioniert!.

.add(Restrictions.sqlRestriction("pk in (?, ?)", new Long[]{166L,171L}, new Type[]{LongType.INSTANCE, LongType.INSTANCE})) 

Ich dachte, ich muss die HQL-Tabelle/Feldnamen verwenden. Aber die Namen/Felder der Phisicall-Tabelle sind korrekt!