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???
 
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!
 
LEFT und RIGHT sind übrigens keine guten Column names, da das in vielen SQL Datenbanken (u.a. MySQL) Standard-Funktionsnamen sind.
 
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.
 
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?
 

Zurück
Oben