2012-05-10 85 views
1

也許我沒有看到它,但指定組有什麼問題?JPQL:語法錯誤解析查詢,意外的令牌

難度查詢數據庫(目前爲空):

public void persist(Msg message) { 
    LOG.info("\t" + message); 
    LOG.info("isOpen?" + em.isOpen()); 
    em.getTransaction().begin(); 
    int id = message.getId(); 
    TypedQuery<Notes> q = em.createQuery("SELECT n " 
      + "FROM Notes n WHERE n.messageId = :messageId " 
      + "AND n.group = :group", Notes.class); 
    q.setParameter("messageId", message.getId()).setParameter("group", message.getGroup()); 
    List<Notes> results = q.getResultList(); 
    em.getTransaction().commit(); 
    for (Notes o : results) { 
     LOG.info("object is \n\n" + o); 
    } 
} 

堆棧跟蹤:

run: 
May 10, 2012 7:17:17 AM net.bounceme.dur.usenet.controller.PropertiesReader getProps 
INFO: NNTP.loadMessages... 
[EL Info]: 2012-05-10 07:17:27.343--ServerSession(29959998)--EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504 
[EL Severe]: 2012-05-10 07:17:29.315--ServerSession(29959998)--Local Exception Stack: 
Exception [EclipseLink-8025] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.JPQLException 
Exception in thread "AWT-EventQueue-0" java.lang.ExceptionInInitializerError 
Exception Description: Syntax error parsing the query [Notes.getByIdAndGroup: SELECT DISTINCT n FROM Notes n WHERE n.messageId = :messageId AND n.group=group], line 1, column 74: unexpected token [group]. 
Internal Exception: NoViableAltException([email protected][792:1: comparisonExpressionRightOperand returns [Object node] : (n= arithmeticExpression | n= nonArithmeticScalarExpression | n= anyOrAllExpression);]) 
    at net.bounceme.dur.usenet.swing.Frame.panelWithTable1PropertyChange(Frame.java:121) 
    at net.bounceme.dur.usenet.swing.Frame.access$100(Frame.java:12) 
    at net.bounceme.dur.usenet.swing.Frame$2.propertyChange(Frame.java:51) 

數據庫:

[email protected]:~$ 
[email protected]:~$ mysql -u java -p 
Enter password: 
Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 141 
Server version: 5.1.58-1ubuntu1 (Ubuntu) 

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. 
This software comes with ABSOLUTELY NO WARRANTY. This is free software, 
and you are welcome to modify and redistribute it under the GPL v2 license 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

mysql> 
mysql> describe nntp.notes; 
+------------+------------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+------------+------------+------+-----+---------+-------+ 
| ID   | bigint(20) | NO | PRI | NULL |  | 
| GROUP_ID | int(11) | NO |  | NULL |  | 
| STAMP  | date  | NO |  | NULL |  | 
| NOTE  | text  | YES |  | NULL |  | 
| MESSAGE_ID | int(11) | NO |  | NULL |  | 
| GROUP  | text  | NO |  | NULL |  | 
+------------+------------+------+-----+---------+-------+ 
6 rows in set (0.03 sec) 

mysql> quit; 
Bye 
[email protected]:~$ 

如果這個類或多個音符?同樣,表格應該是註釋還是註釋?也許沒關係。

實體:

package net.bounceme.dur.usenet.controller; 

import java.io.Serializable; 
import java.util.Date; 
import javax.persistence.*; 
import javax.xml.bind.annotation.XmlRootElement; 

@Entity 
@Table(name = "notes", catalog = "nntp", schema = "") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "Notes.findAll", query = "SELECT n FROM Notes n"), 
    @NamedQuery(name = "Notes.findById", query = "SELECT n FROM Notes n WHERE n.id = :id"), 
    @NamedQuery(name = "Notes.findByGroupId", query = "SELECT n FROM Notes n WHERE n.groupId = :groupId"), 
    @NamedQuery(name = "Notes.findByStamp", query = "SELECT n FROM Notes n WHERE n.stamp = :stamp"), 
    @NamedQuery(name = "Notes.findByMessageId", query = "SELECT n FROM Notes n WHERE n.messageId = :messageId"), 
    @NamedQuery(name = "Notes.getByIdAndGroup", query = "SELECT DISTINCT n FROM Notes n WHERE n.messageId = :messageId AND n.group=group"), 
}) 
public class Notes implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "ID", nullable = false) 
    private Long id; 
    @Basic(optional = false) 
    @Column(name = "GROUP_ID", nullable = false) 
    private int groupId; 
    @Basic(optional = false) 
    @Column(name = "STAMP", nullable = false) 
    @Temporal(TemporalType.DATE) 
    private Date stamp; 
    @Lob 
    @Column(name = "NOTE", length = 65535) 
    private String note; 
    @Basic(optional = false) 
    @Column(name = "MESSAGE_ID", nullable = false) 
    private int messageId; 
    @Basic(optional = false) 
    @Lob 
    @Column(name = "GROUP", nullable = false, length = 65535) 
    private String group; 

    public Notes() { 
    } 

    public Notes(Long id) { 
     this.id = id; 
    } 

    public Notes(Long id, int groupId, Date stamp, int messageId, String group) { 
     this.id = id; 
     this.groupId = groupId; 
     this.stamp = stamp; 
     this.messageId = messageId; 
     this.group = group; 
    } 

    public Long getId() { 
     return id; 
    } 

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

    public int getGroupId() { 
     return groupId; 
    } 

    public void setGroupId(int groupId) { 
     this.groupId = groupId; 
    } 

    public Date getStamp() { 
     return stamp; 
    } 

    public void setStamp(Date stamp) { 
     this.stamp = stamp; 
    } 

    public String getNote() { 
     return note; 
    } 

    public void setNote(String note) { 
     this.note = note; 
    } 

    public int getMessageId() { 
     return messageId; 
    } 

    public void setMessageId(int messageId) { 
     this.messageId = messageId; 
    } 

    public String getGroup() { 
     return group; 
    } 

    public void setGroup(String group) { 
     this.group = group; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (id != null ? id.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Notes)) { 
      return false; 
     } 
     Notes other = (Notes) object; 
     if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "net.bounceme.dur.usenet.controller.Notes[ id=" + id + " ]"; 
    } 

} 

現在我只使用一個表,但似乎無法得到一個工作查詢。

回答

1

語法錯誤解析查詢[Notes.getByIdAndGroup:SELECT DISTINCT n的註釋N其中n.messageId =:郵件ID以及n.group =基團],第1行,列74:意外的標記[組]。

在SQL中,GROUP是一個保留字,這可能是此錯誤消息的原因。在JPA2應該可以通過改變註釋在查詢中引用的列名

@Column(name="\"GROUP\"") 

如果不工作你的情況,最好的辦法是將數據庫列和註釋更改爲類似GROUP_NAME

+0

更改了我的數據庫架構,謝謝。 – Thufir

1

"SELECT DISTINCT n FROM Notes n WHERE n.messageId = :messageId AND n.group=group" 

應該

"SELECT DISTINCT n FROM Notes n WHERE n.messageId = :messageId AND n.group=:group" 

它缺少在組PARAM一個冒號。

+0

我的錯,我覺得我粘貼了日期代碼或什麼的。 – Thufir