MySql Select语句失败

时间:2015-02-21 04:56:44

标签: java mysql jpa desktop-application

我正在连接到MySql服务器。 MySql服务器是版本5.1.36。我正在将Java SE与Eclipse Link一起用于我的JPA。

我注意到当我构建我的类时,我必须将我的SQL语句设置为

SELECT EMP.Index, EMP.Name FROM EMP”而不是“SEECT 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;
    }
}

我的控制器类

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);
    }
}

我的持久文件

http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd”   version =“2.0”xmlns =“http://java.sun.com/xml/ns/persistence”&gt;   

<class>com.movie.domain.CMovieType</class>
<class>com.movie.domain.CGenre</class>
<class>com.movie.domain.CDiscType</class>
 <class>com.movie.domain.CActor</class>
 <class>com.movie.domain.CMovie</class>

<properties>
  <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
  <property name="javax.persistence.jdbc.url" value="jdbc:mysql://xxxxx/Movies" />
  <property name="javax.persistence.jdbc.user" value="xxxxx" />
  <property name="javax.persistence.jdbc.password" value="xxxxx" />
</properties>

 

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

  

内部例外:   com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:你有一个   SQL语法错误;查看与您的手册相对应的手册   用于在'Index附近使用正确语法的MySQL服务器版本,   描述FROM Genre'在第1行错误代码:1064电话:SELECT Index,   说明FROM Genre查询:ReadAllQuery(referenceClass = CGenre   sql =“SELECT索引,描述FROM Genre”)

我目前的工作是将所有域拆分为单个和多个注释。这将增加我的维护工作和(在我个人看来)令人不满意的代码。

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

谢谢,社区。

1 个答案:

答案 0 :(得分:0)

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