org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: right near

Schuriko

Bekanntes Mitglied
Ich habe mir für MySQL Datenbank eine NestedSet - Table erstellt:
Code:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

@Entity
public class NestedSet {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
   
    @NotNull
    @Min(1)
    @Column(name="lft")
    private Long left = 1L;
   
    @NotNull
    @Min(2)
    @Column(name="rgt")
    private Long right = 2L;

    public NestedSet() {
        super();
    }
   
    public Long getId() {
        return id;
    }

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

    public Long getLeft() {
        return left;
    }

    public void setLeft(Long left) {
        this.left = left;
    }

    public Long getRight() {
        return right;
    }

    public void setRight(Long right) {
        this.right = right;
    }

    /**
     * count the child for this entry
     *
     * @return Long
     */
    public Long countChilds() {
        return (this.right - this.left - 1) / 2;
    }
   
    /**
     * has this entry childrens
     *
     * @return boolean
     */
    public boolean hasChilds() {
        return (this.right - this.left) == 1;
    }

    @Override
    public String toString() {
        return "NestedSet [id=" + id + ", left=" + left + ", right=" + right + ", countChilds()=" + countChilds()
                + ", hasChilds()=" + hasChilds() + "]";
    }   
}

und dem Repository
Code:
@Repository
public interface NestedSetRepository extends CrudRepository<NestedSet, Long> {

    @Query("SELECT ns FROM NestedSet ns WHERE ns.left > ?1 AND ns.right < ?2")
    List<NestedSet> getChilds(Long left, Long right);
   
    @Query("UPDATE NestedSet SET right=right+2 WHERE right >= ?1")
    void extendNestedSet(Long right);
   
}

erhalte ich eine Compilermeldung:
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: right near line 1, column 70 [UPDATE com.nestedset.entities.NestedSet SET right=right+2 WHERE right >= ?1]

Weis einer was hier gerade schief läuft???
 
K

kneitzel

Gast
Das Column heisst auch nicht right: @Column(name="rgt"). In der SQL Abfrage musst Du das natürlich so angeben, wie es die Datenbank sieht!
 

Wurstkopp

Bekanntes Mitglied
LEFT und RIGHT sind übrigens keine guten Column names, da das in vielen SQL Datenbanken (u.a. MySQL) Standard-Funktionsnamen sind.
 

Schuriko

Bekanntes Mitglied
Das Column heisst auch nicht right: @Column(name="rgt"). In der SQL Abfrage musst Du das natürlich so angeben, wie es die Datenbank sieht!
Das ist richtig, aber wenn ich "rgt" oder "lft" schreibe, dann mosert er diese an. Dieses habe ich durch den Test:
Code:
    @Test
    void testGetChilds() {
        NestedSet nestedSetRoot = new NestedSet();
        nestedSetRoot.setRight(6L);
        nestedSetRepository.save(nestedSetRoot);
        
        NestedSet nestedSetEntry1 = new NestedSet();
        nestedSetEntry1.setLeft(2L);
        nestedSetEntry1.setRight(3L);
        nestedSetRepository.save(nestedSetEntry1);
        
        NestedSet nestedSetEntry2 = new NestedSet();
        nestedSetEntry2.setLeft(4L);
        nestedSetEntry2.setRight(5L);
        nestedSetRepository.save(nestedSetEntry2);
        
        List<NestedSet> list = nestedSetRepository.getChilds(1L, 6L);
        
        assertEquals(list.size(), 2);
        assertEquals(list.get(0).getId(), nestedSetEntry1.getId());
        assertEquals(list.get(1).getId(), nestedSetEntry2.getId());
        
        // clean up
        nestedSetRepository.deleteAll();
    }
herausgefunden, da die SQL kein Native ist sondern JPQL.
 

Wurstkopp

Bekanntes Mitglied
In deiner Query steht "SET right=right+2". Habe lang nichts mehr mit Hibernate gemacht, das kann er doch nicht selber nach rgt auflösen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
P Hibernate Proxy Allgemeine Java-Themen 1
C Hibernate EJB JTA Allgemeine Java-Themen 4
M JAXB Reimport zu Hibernate DB -> Exception Allgemeine Java-Themen 3
Shoox Hibernate / JAXB für Schnittstellen Allgemeine Java-Themen 4
Jay_030 Guice + Hibernate = Probleme? Allgemeine Java-Themen 2
G Hibernate search (Lucene) - Index wird nicht rechtzeitig erzeugt? Allgemeine Java-Themen 2
H Hibernate: @OneToOne Beziehung Allgemeine Java-Themen 4
N Hibernate und Fehlermeldung Allgemeine Java-Themen 18
neurox Tutorial: Hibernate mit MySQL (erste Schritte) Allgemeine Java-Themen 34
P Hibernate oder Java Persistence API? Allgemeine Java-Themen 3
A Spring und Hibernate Allgemeine Java-Themen 2
MQue log4j mit hibernate Allgemeine Java-Themen 3
F Hibernate speichern - Null Allgemeine Java-Themen 5
T Wie Hibernate im Tomcat installieren? Allgemeine Java-Themen 2
M Hibernate frage zur Verbindung Allgemeine Java-Themen 3
G Hibernate, JTable und Performance Allgemeine Java-Themen 17
G Obfuscator und Hibernate! Allgemeine Java-Themen 5
W JBoss,Axis2,Hibernate/JPA,Oracle - EntityManager Problem Allgemeine Java-Themen 4
T Hibernate Criteria Queries - Abfragen von Collection-Members Allgemeine Java-Themen 2
J Hibernate & Java Allgemeine Java-Themen 4
A Hibernate und Swing Allgemeine Java-Themen 2
G Hibernate speichert Daten nur während Session in HSQL-DB Allgemeine Java-Themen 10
F Reason: Missing Constraint: Import-Package: okhttp3.internal.http; version="0.0.0" Allgemeine Java-Themen 0
S An internal error occurred during: Launching null argument Allgemeine Java-Themen 1
S HTTPUnit Test Fehler: Error on HTTP request: 500 Internal Er Allgemeine Java-Themen 9
C Sound: Keine Line gefunden. Zu großer internal buffer? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben