【问题标题】:Error in sqlException when attempting to use generated named query尝试使用生成的命名查询时出现 sqlException 错误
【发布时间】:2014-03-08 13:18:12
【问题描述】:

我创建了一个 bean:

package beans;

import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import mazeJPA.Forumcategory;

/**
 * Session Bean implementation class ForumBean
 */
@Stateless
@LocalBean
public class ForumBean
{

    @PersistenceContext(unitName = "mazeEJB")
    private EntityManager em;

    /**
     * Default constructor.
     */
    public ForumBean(){}


    public List<Forumcategory> getCategories()
    {
        return em.createNamedQuery
        (
                "Forumcategory.findAll", Forumcategory.class
        ).getResultList();
    }
}

及其实体类

package mazeJPA;

import java.io.Serializable;
import javax.persistence.*;


/**
 * The persistent class for the forumcategory database table.
 * 
 */
@Entity
@Table(name="forumcategory")
@NamedQuery(name="Forumcategory.findAll", query="SELECT f FROM Forumcategory f")
public class Forumcategory implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int cid;

    private String desc;

    private String name;

    public Forumcategory() {
    }

    public int getCid() {
        return this.cid;
    }

    public void setCid(int cid) {
        this.cid = cid;
    }

    public String getDesc() {
        return this.desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

当我从我的 servlet 调用 getCategories() 时,我得到一个 sql 异常:

 Internal Exception:
 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 'DESC, NAME FROM
 forumcategory' at line 1 Error Code: 1064 Call: SELECT CID, DESC, NAME
 FROM forumcategory Query: ReadAllQuery(name="Forumcategory.findAll"
 referenceClass=Forumcategory sql="SELECT CID, DESC, NAME FROM
 forumcategory")

我的桌子是:

  cid INT NOT NULL, name VARCHAR(255) NOT NULL, desc TEXT NOT NULL,
  PRIMARY KEY (cid)

我不知道为什么会这样。我的映射有问题吗?我最近才将它添加到我的项目中,与它有什么关系,即我必须一次生成所有表吗?

【问题讨论】:

    标签: java mysql sql jpa eclipselink


    【解决方案1】:

    DESC 是一个 reserved sql 字,所以你必须使用 desc 对其进行转义,例如

    SELECT CID, `DESC`, NAME FROM ...
    

    【讨论】:

    • 谢谢你,我应该意识到这一点。
    • 不客气,有时会发生这种情况;)。我会避免为列使用此名称。
    • 我把它改成了我一开始就应该使用的描述。
    • 好主意@onesixtyfourth。如果对您有帮助,请记得采纳答案。
    【解决方案2】:

    DESC 是大多数 SQL 中的保留关键字。似乎您的 JPA 提供程序不会自动为您转义这些(用引号引起来)。一些 JPA 实现(例如 DataNucleus JPA)会为您做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2021-04-13
      • 2018-09-11
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多