Java MySql Select语句失败

Java MySql Select语句失败,java,mysql,jpa,desktop-application,Java,Mysql,Jpa,Desktop Application,我正在连接MySql服务器。MySql服务器的版本是5.1.36。我正在为我的JPA使用JavaSE和Eclipse链接 我注意到,在构造类时,必须将SQL语句设置为 选择EMP.Index,EMP.Name FROM EMP”而不是“选择Index,Name FROM EMP” 这导致了一些问题,因为我有更复杂的对象使用一对多和多对多注释 我的类中是否可能存在设置问题,或者这是我使用的MySql数据库的一个限制 此类实现将与多对多注释一起使用,但与我的控制器实现不一起使用 @Entity @T

我正在连接MySql服务器。MySql服务器的版本是5.1.36。我正在为我的JPA使用JavaSE和Eclipse链接

我注意到,在构造类时,必须将SQL语句设置为

选择EMP.Index,EMP.Name FROM EMP
”而不是“
选择Index,Name FROM EMP

这导致了一些问题,因为我有更复杂的对象使用一对多和多对多注释

我的类中是否可能存在设置问题,或者这是我使用的MySql数据库的一个限制

此类实现将与多对多注释一起使用,但与我的控制器实现不一起使用

@Entity
@Table(name="Genre")
public class CGenre implements CGenericDomain, Serializable {
    @Id
    @GeneratedValue(generator = "generator")
    @Column(name="Index", unique = true, nullable = false)
    private int itsIndex;

    @Column(name="Description")
    private String itsDescription;

    public CGenre()
    {
        // Do Nothing
    }

    public CGenre(String pDescription)
    {
        itsDescription = pDescription;
    }

    public void setItsIndex(int pIndex)
    {
        itsIndex = pIndex;
    }

    public int getItsIndex()
    {
        return itsIndex;
    }

    public String getItsDescription()
    {
        return itsDescription;
    }

    public void setItsDescription(String itsDescription)
    {
        this.itsDescription = itsDescription;
    }

    @Override
    public Object getValue(String pObjName) {
        if (pObjName.equals("Description"))
        {
            return getItsDescription();
        }
        return null;
    }

    @Override
    public boolean setValue(String pObjName, Object pObjValue) {
        boolean result = false;
        if (pObjName.equals("Description"))
        {
            setItsDescription(pObjValue.toString());
            result = true;
        }
        return result;
    }
}
@Entity
@Table(name="Genre")
public class CGenre implements CGenericDomain, Serializable {
    @Id
    @GeneratedValue(generator = "generator")
    @Column(name="Genre.Index", unique = true, nullable = false)
    private int itsIndex;

    @Column(name="Genre.Description")
    private String itsDescription;

    public CGenre()
    {
        // Do Nothing
    }

    public CGenre(String pDescription)
    {
        itsDescription = pDescription;
    }

    public void setItsIndex(int pIndex)
    {
        itsIndex = pIndex;
    }

    public int getItsIndex()
    {
        return itsIndex;
    }

    public String getItsDescription()
    {
        return itsDescription;
    }

    public void setItsDescription(String itsDescription)
    {
        this.itsDescription = itsDescription;
    }

    @Override
    public Object getValue(String pObjName) {
        if (pObjName.equals("Description"))
        {
            return getItsDescription();
        }
        return null;
    }

    @Override
    public boolean setValue(String pObjName, Object pObjValue) {
        boolean result = false;
        if (pObjName.equals("Description"))
        {
            setItsDescription(pObjValue.toString());
            result = true;
        }
        return result;
    }
}
这部分代码,我可以将其用于我的控制器实现

@Entity
@Table(name="Genre")
public class CGenre implements CGenericDomain, Serializable {
    @Id
    @GeneratedValue(generator = "generator")
    @Column(name="Index", unique = true, nullable = false)
    private int itsIndex;

    @Column(name="Description")
    private String itsDescription;

    public CGenre()
    {
        // Do Nothing
    }

    public CGenre(String pDescription)
    {
        itsDescription = pDescription;
    }

    public void setItsIndex(int pIndex)
    {
        itsIndex = pIndex;
    }

    public int getItsIndex()
    {
        return itsIndex;
    }

    public String getItsDescription()
    {
        return itsDescription;
    }

    public void setItsDescription(String itsDescription)
    {
        this.itsDescription = itsDescription;
    }

    @Override
    public Object getValue(String pObjName) {
        if (pObjName.equals("Description"))
        {
            return getItsDescription();
        }
        return null;
    }

    @Override
    public boolean setValue(String pObjName, Object pObjValue) {
        boolean result = false;
        if (pObjName.equals("Description"))
        {
            setItsDescription(pObjValue.toString());
            result = true;
        }
        return result;
    }
}
@Entity
@Table(name="Genre")
public class CGenre implements CGenericDomain, Serializable {
    @Id
    @GeneratedValue(generator = "generator")
    @Column(name="Genre.Index", unique = true, nullable = false)
    private int itsIndex;

    @Column(name="Genre.Description")
    private String itsDescription;

    public CGenre()
    {
        // Do Nothing
    }

    public CGenre(String pDescription)
    {
        itsDescription = pDescription;
    }

    public void setItsIndex(int pIndex)
    {
        itsIndex = pIndex;
    }

    public int getItsIndex()
    {
        return itsIndex;
    }

    public String getItsDescription()
    {
        return itsDescription;
    }

    public void setItsDescription(String itsDescription)
    {
        this.itsDescription = itsDescription;
    }

    @Override
    public Object getValue(String pObjName) {
        if (pObjName.equals("Description"))
        {
            return getItsDescription();
        }
        return null;
    }

    @Override
    public boolean setValue(String pObjName, Object pObjValue) {
        boolean result = false;
        if (pObjName.equals("Description"))
        {
            setItsDescription(pObjValue.toString());
            result = true;
        }
        return result;
    }
}
我的控制器类

public class CGenreController extends CGenericController<CGenre> {

    @Override
    public List getAll() {
        return itsEntityManager.createQuery("Select m From CGenre m", CGenre.class).getResultList();
    }

    @Override
    public void setValue(CGenre pIn) {
        itsEntityManager.getTransaction().begin();
        itsEntityManager.merge((CGenre)pIn);
        itsEntityManager.getTransaction().commit();
    }

    @Override
    public CGenre getValue(int pInt) {
        List<CGenre> result = itsEntityManager.createQuery("select m from CGenre m where m.Index = ?1")
        .setParameter(1, pInt).getResultList();
        if (result.size() > 1)
        {
            return null;
        }
        return result.get(0);
    }
}
公共类CGenreController扩展CGenericController{
@凌驾
公共列表getAll(){
返回其EntityManager.createQuery(“从CGenre m中选择m”,CGenre.class).getResultList();
}
@凌驾
公共无效设置值(CGenre pIn){
itsEntityManager.getTransaction().begin();
itsEntityManager.merge((CGenre)pIn);
itsEntityManager.getTransaction().commit();
}
@凌驾
公共CGenre getValue(整数品脱){
List result=itsenitymanager.createQuery(“从CGenre m中选择m,其中m.Index=?1”)
.setParameter(1,品脱).getResultList();
如果(result.size()>1)
{
返回null;
}
返回结果get(0);
}
}
我的持久性文件

http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version=“2.0”xmlns=”http://java.sun.com/xml/ns/persistence">

com.movie.domain.CMovieType
com.movie.domain.CGenre
com.movie.domain.CDiscType
com.movie.domain.CActor
com.movie.domain.CMovie

执行期间我收到的错误消息:

内部异常: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您有一个 SQL语法错误;请检查与您的SQL语法对应的手册 MySQL服务器版本,以便使用near'Index的正确语法, 第1行“流派”中的描述错误代码:1064调用:选择索引, 类型查询的描述:ReadAllQuery(referenceClass=CGenre sql=“从类型中选择索引、描述”)

我目前的工作方法是将所有域分割成单个和多个注释。这将增加我的维护工作和(我个人认为)不满意的代码

你对我做错了什么的想法会有很大帮助


谢谢,社区。

index
是SQL中的保留关键字。不要命名您的列
index

此外,您的第二个查询无效。您确实需要意识到您的查询不是SQL查询,而是JPQL查询。而且JPQL从不使用列名。它使用带注释字段的名称。因此,查询应该是:

select m from CGenre m where m.itsIndex = ?1
这应该会让你意识到你的非标准命名约定是多么糟糕。如果你遵循标准命名约定,类将被命名为
Genre
,属性将被命名为
index
,查询和代码将更具可读性,使用真正的英文名称:

select g from Genre g where g.index = ?1

哪个调用导致了这个错误?db列的标准名称约定是什么?没有。但我在回答中提到的是Java字段的约定。不是数据库列。是的,大学教授告诉我,我可能会多次提到我的Java字段。这是我在职业生涯中学到的东西,我没有放弃d、 再次感谢您指出索引是一个关键字。我有一个他们的关键字副本,并检查以确保我没有任何冲突。