MySql Select 声明失败
MySql Select Statement Failing
我正在连接到 MySql 服务器。 MySql 服务器的版本是 5.1.36。我正在为我的 JPA 使用 Java SE 和 Eclipse Link。
我注意到当我构造我的 class 时,我必须将我的 SQL 语句设置为
"SELECT EMP.Index, EMP.Name FROM EMP
" 而不是 "SEECT Index, Name FROM EMP
"
这导致了一些问题,因为我有更复杂的对象使用一对多和多对多注释。
我的 class 是否有设置问题,或者这是我使用的 MySql 数据库的限制?
此 class 实现将适用于多对多注释,但不适用于我的控制器实现
@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;
}
}
我的控制器class
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">
<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>
我在执行过程中收到的错误消息:
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 'Index,
Description FROM Genre' at line 1 Error Code: 1064 Call: SELECT Index,
Description FROM Genre Query: ReadAllQuery(referenceClass=CGenre
sql="SELECT Index, Description FROM Genre")
我目前的工作是为单个和多个注释拆分所有域。这将增加我的维护工作和(在我个人看来)不令人满意的代码。
你对我做错了什么的想法会有很大帮助。
感谢社区。
index
是 SQL 中的保留关键字。不要将您的列命名为 index
.
另外,您的第二个查询无效。您确实需要意识到您的查询不是 SQL 查询,而是 JPQL 查询。而且 JPQL 从不使用列名。它使用带注释的字段的名称。所以查询应该是:
select m from CGenre m where m.itsIndex = ?1
这会让您意识到您的非标准命名约定是多么糟糕。如果您遵循标准,class 将被命名为 Genre
,属性 将被命名为 index
,查询和代码将更具可读性,使用真实的英文名字:
select g from Genre g where g.index = ?1
我正在连接到 MySql 服务器。 MySql 服务器的版本是 5.1.36。我正在为我的 JPA 使用 Java SE 和 Eclipse Link。
我注意到当我构造我的 class 时,我必须将我的 SQL 语句设置为
"SELECT EMP.Index, EMP.Name FROM EMP
" 而不是 "SEECT Index, Name FROM EMP
"
这导致了一些问题,因为我有更复杂的对象使用一对多和多对多注释。
我的 class 是否有设置问题,或者这是我使用的 MySql 数据库的限制?
此 class 实现将适用于多对多注释,但不适用于我的控制器实现
@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;
}
}
我的控制器class
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">
<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>
我在执行过程中收到的错误消息:
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 'Index, Description FROM Genre' at line 1 Error Code: 1064 Call: SELECT Index, Description FROM Genre Query: ReadAllQuery(referenceClass=CGenre sql="SELECT Index, Description FROM Genre")
我目前的工作是为单个和多个注释拆分所有域。这将增加我的维护工作和(在我个人看来)不令人满意的代码。
你对我做错了什么的想法会有很大帮助。
感谢社区。
index
是 SQL 中的保留关键字。不要将您的列命名为 index
.
另外,您的第二个查询无效。您确实需要意识到您的查询不是 SQL 查询,而是 JPQL 查询。而且 JPQL 从不使用列名。它使用带注释的字段的名称。所以查询应该是:
select m from CGenre m where m.itsIndex = ?1
这会让您意识到您的非标准命名约定是多么糟糕。如果您遵循标准,class 将被命名为 Genre
,属性 将被命名为 index
,查询和代码将更具可读性,使用真实的英文名字:
select g from Genre g where g.index = ?1