MySQLSyntaxErrorException, хотя все выглядит нормально (Hibernate) - PullRequest
2 голосов
/ 19 июня 2010

У меня есть объект Project и группа.Я могу получить проект по имени, используя следующий метод получения из DAO:

public Project getProject(String name){
    Project project = null;

    DetachedCriteria criteria = DetachedCriteria.forClass(Project.class);
    criteria.add(Restrictions.eq("name", name));
    List<Project> projects = getHibernateTemplate().findByCriteria(criteria);
    if ((projects != null) && (projects.size() > 0)) {
        project = (Project)projects.get(0);
    }
    return project;
}

В то время как эта та же самая сборка не работает для группы DAO:

public Group getGroup(String name){
    Group group = null;

    DetachedCriteria criteria = DetachedCriteria.forClass(Group.class);
    criteria.add(Restrictions.eq("name", name));
    List<Group> groups = getHibernateTemplate().findByCriteria(criteria);
    if ((groups != null) && (groups.size() > 0)) {
        group = (Group)groups.get(0);
    }
    return group;
}

Вот стектрассировка, которая идет (это появляется, когда я пытаюсь создать новую группу; выбирается группа с предоставленным именем, чтобы проверить, существует ли такая группа, и выдает исключение, если так):

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: у вас есть ошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с 'group this_, где this_.name =' new_group '' в строке 1 sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) sun.reflect.DelegatingConstructorAccessorImpl.newInstance (ДелегированиеConstructorAccessorImpl.java:27): 409) com.mysql.jdbc.Util.getInstance (Util.java:384) com.mysql.jdbc.SQLError.createSQLException (SQLError.java:1054) com.mysql.jdbc.MysqlIO.checkErrorPacket.jys62 :35) com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:3494) com.mysql.jdbc.MysqlIO.sendCommand (MysqlIO.java:1960) com.mysql.jdbc.MysqlIO.sqlQueryIO4) (MysqlIO.sqlQueryIO4).mysql.jdbc.ConnectionImpl.execSQL (ConnectionImpl.java:2696) com.mysql.jdbc.PreparedStatement.executeInternal (PreparedStatement.Java: 2105) com.mysql.jdbc.PreparedStatement.executeQuery (PreparedStatement.java:2264) org.hibernate.jdbc.AbstractBatcher.getResultSet (AbstractBatcher.java:187) org.hibernate.loader.LjaderS (Loader. Loader.Ru)1791) org.hibernate.loader.Loader.doQuery (Loader.java:674) org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections (Loader.java:236) org.hibernate.loader.Loader.doList: Lo21.jorg.hibernate.loader.Loader.listIgnoreQueryCache (Loader.java:2108) org.hibernate.loader.Loader.list (Loader.java:2103) org.hibernate.loader.criteria.CriteriaLoader.list (CriteriaLoader.java:94)org.hibernate.impl.SessionImpl.list (SessionImpl.java:1570) org.hibernate.impl.CriteriaImpl.list (CriteriaImpl.java:283) org.springframework.orm.hibernate3.HibernateTemplate $ 35.doInHibernate98: Hava) org.springframework.orm.hibernate3.HibernateTemplate.execute (HibernateTemplate.java:372) org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria (HibernateTemplate.java:974) org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria (HibernateTemplate.java:967) pl.edu.agh.adam.core.projects.dao.GroupDAO.getGroup (GroupDAO.java:65) pl.edu.agh.adam.core.projects.GroupService.createGroup (GroupService.java:76) pl.edu.agh.adam.core.projects.web.CreateGroupBean.create (CreateGroupBean.java:80) sun.reflect.NativeMethodAccessorImplin) sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) java.lang.redjj.hog.hog.parser.AstValue.invoke (AstValue.java:234) com.sun.el.MethodExpressionImpl.invoke (MethodExpressionImpl.java:297) org.apache.myfaces.view.facelets.el.TagMethodExpression.invoke (TagMethod:) javax.faces.component._MethodExpressionToMethodBinding.invoke (_MethodExpressionToMethodBinding.java:88) org.apache.myfaces.application.ActionListenerImpl.processAction (ActionListenerImpl.java:100) javax.faces.component.UICommand.broadcast (UICommand.java:120) javax.faces.component.UIViewRoot._broadcastAll (UIViewRoot.java:890) javax.faces.component.UIViewRoot.broadcastEots.Java: 234)javax.faces.component.UIViewRoot._process (UIViewRoot.java:1202) javax.faces.component.UIViewRoot.processApplication (UIViewRoot.java:623) org.apache.myfaces.lifecycle.InvokeApplicationExecutor.exavate) ()org.apache.myfaces.lifecycle.LifecycleImpl.executePhase (LifecycleImpl.java:143) org.apache.myfaces.lifecycle.LifecycleImpl.execute (LifecycleImpl.java:93) javax.faces.webapp.FacesServlet.service (Faces:189) org.primefaces.webapp.filter.doFilter (OncePerRequestFilter.java:76)

Вот сущности (геттеры и сеттеры опущены):

@Entity
@Table(name = "group")
public class Group implements Serializable {
    private static final long serialVersionUID = 1L;

    @Transient
    public static final String REF = "Group";

    @ManyToMany(targetEntity = pl.edu.agh.adam.core.account.hibernate.User.class)
    @JoinTable(name = "group_user", joinColumns = @JoinColumn(name = "group_id"), inverseJoinColumns = @JoinColumn(name = "user_id"))
    Set<User> users;

    public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }

    @ManyToMany(targetEntity = pl.edu.agh.adam.core.projects.hibernate.Role.class)
    @JoinTable(name = "project_group_role", joinColumns = @JoinColumn(name = "group_id"))
    @MapKeyJoinColumn(name = "project_id")
    Map<Project, Role> projectRoles;

    @Transient
    public static final String PROP_ID = "id";

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "group_id")
    private Long id;

    @Transient
    public static final String PROP_NAME = "name";
    @Column(name = "name", length = 25, unique = true, nullable = false)
    private String name;

    @Transient
    public static final String PROP_PASSWORD = "password";

    @Column(name = "password", length = 40)
    private String password;

    @Transient
    public static final String PROP_SUBSCRIBABLE = "subscribable";

    @Column(name = "subscribable")
    private Boolean subscribable;
}

Другая (рабочая):

@Entity
@Table(name = "project")
public class Project implements Serializable {

private static final long serialVersionUID = 1L;

@Transient
public static final String REF = "Project";

@ManyToMany(targetEntity = pl.edu.agh.adam.core.projects.hibernate.Tag.class)
@JoinTable(name = "project_tag", joinColumns = @JoinColumn(name = "project_id"), inverseJoinColumns = @JoinColumn(name = "tag_id"))
private List<Tag> tags;

@ManyToMany(targetEntity = pl.edu.agh.adam.core.projects.hibernate.Group.class)
@JoinTable(name = "project_group_role",
        joinColumns = @JoinColumn(name = "project_id"),
        inverseJoinColumns = @JoinColumn(name = "group_id"))
private Set<Group> groups;

@ManyToMany(targetEntity = pl.edu.agh.adam.core.projects.hibernate.Role.class)
@JoinTable(name = "project_group_role",
        joinColumns = @JoinColumn(name = "project_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;


@Transient
public static final String PROP_ID = "id";

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "project_id")
private Long id;

@Transient
public static final String PROP_NAME = "name";
@Column(name = "name", length = 60, unique = true, nullable = false)
private String name;

@Transient
public static final String PROP_SHORTNAME = "shortname";

@Column(name = "shortname", length = 25, unique = true)
private String shortname;

@Transient
public static final String PROP_HOMEPAGE = "homepage";
@Column(name = "homepage", length = 60)
private String homepage;

@Transient
public static final String PROP_DESCRIPTION = "description";
@Column(name = "description", columnDefinition = "LONGTEXT")
private String description;

  }

Также структуры таблиц: group: -group_id int (11) автоинкремент, не нулевое -name varchar (25) уникальное, не нулевое -password varchar (40) -подписываемый tinyint (1)

project

-project_id int (11) автоинкремент, не ноль-имя varchar (60) уникальное, не ноль -кортное имя varchar (25)) -homepage varchar (25) -текст описания

Я включил ведение журнала запросов гибернации в System.out;если производится следующее:

select
    this_.project_id as project1_3_0_,
    this_.description as descript2_3_0_,
    this_.homepage as homepage3_0_,
    this_.name as name3_0_,
    this_.shortname as shortname3_0_ 
from
    project this_ 
where
    this_.name=?

А не работает:

select
    this_.group_id as group1_4_0_,
    this_.name as name4_0_,
    this_.password as password4_0_,
    this_.subscribable as subscrib4_4_0_ 
from

group this_ where
    this_.name=?

Что происходит ??(

1 Ответ

1 голос
/ 20 июня 2010

Я не сразу заметил это, но group - зарезервированное ключевое слово, поэтому сгенерированный запрос действительно неверен.Используйте другое имя таблицы для объекта Group.Например:

@Entity
@Table(name = "groups")
public class Group implements Serializable {

    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...