2011-04-11 4 views
4

재생 나는이 예외를 받고 있어요의 CRUD 모듈에서 일부 개체에 대한 검색을 시도 :플레이 프레임 워크 CRUD 검색 문제

play.exceptions.JavaExecutionException: org.hibernate.exception.SQLGrammarException: could not execute query 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:290) 
    at Invocation.HTTP Request(Play!) 
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1235) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1168) 
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:250) 
    at play.db.jpa.JPAPlugin$JPAModelLoader.fetch(JPAPlugin.java:431) 
    at controllers.CRUD$ObjectType.findPage(CRUD.java:253) 
    at controllers.CRUD.list(CRUD.java:36) 
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:413) 
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:408) 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:182) 
    ... 1 more 
Caused by: org.hibernate.exception.SQLGrammarException: could not execute query 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.loader.Loader.doList(Loader.java:2452) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2192) 
    at org.hibernate.loader.Loader.list(Loader.java:2187) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363) 
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) 
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258) 
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) 
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:241) 
    ... 7 more 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'CHARSET' in 'where clause' 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) 
    at com.mysql.jdbc.Util.getInstance(Util.java:384) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113) 
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2275) 
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) 
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1869) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:718) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270) 
    at org.hibernate.loader.Loader.doList(Loader.java:2449) 
    ... 15 more 

이상한 점은 검색이 일부 엔티티가 아닌 다른 사람을 위해 작동합니다. 예를 들어, 검색 상자에 문자열을 추가하는 다음과 같은 엔터티에 대해 작동합니다

@Entity 
public class Act extends Model { 

    @Transient 
    private static final int PAGE_SIZE = Integer.parseInt(Play.configuration.getProperty("pagination.size","10")); 

    @Required(message = "act.name.required") 
    public String name; 

    @Required(message = "act.description.required") 
    @Lob 
    @MaxSize(value=500, message="act.description.maxsize") 
    public String description; 

    public Blob image; 

    public boolean showInClosedMode; 

    @Temporal(TemporalType.TIMESTAMP) 
    public Date updated; 

    @Required(message = "act.theatre.required") 
    @ManyToOne 
    public Theatre theatre; 

    public boolean disabled; 

    @OneToMany(mappedBy="act") 
    public List<Offer> offers; 

    @ManyToMany(cascade=CascadeType.PERSIST) 
    public Set<Tag> tags; 
    @Transient 
    public String tagListSupport; 

    [... some methods ...] 
    } 

하지만이 하나 :

@Entity 
public class User extends Model { 

    @Required(message = "user.name.required") 
    public String name; 
    @Email(message = "user.email.invalid") 
    public String email; 
    public String prefLang; 
    public Long prefCity; 
    public int credits; 
    public Date lastLogin; 
    @NoBinding("profile") 
    public boolean disabled; 
    @NoBinding("profile") 
    public boolean admin; 
    @NoBinding("profile") 
    public boolean anonymous; 
    @OneToMany(mappedBy = "owner") 
    public List<Ticket> tickets; 
    @ManyToMany 
    public List<Theatre> theatres; 
    public String googleId; 
    public String yahooId; 
    public String facebookId; 
    public String twitterId; 
    public String twitter_token; 
    public String twitter_secret; 
    public String username; 
    public String password; 
    @OneToMany(mappedBy = "user") 
    public List<Event> history; 

    [...Methods...] 
} 

이런 일이 발생하는 이유 어떤 생각?

+0

당신이 나쁜 생성 된 SQL 쿼리 문자열이없는 내 문제를 해결하기 위해? 이 문자열에서 귀하의 모델이 무엇이 잘못되었는지를 코드를 통해 볼 수 있습니다. – mandubian

+0

생성 된 SQL에 대한 뉴스가 있습니까? 어쨌든 코드를 분석하는 데 나만큼 숙련 될 수 있습니다.) ... 도와 주려는 것입니다. – mandubian

+0

실제로 생성 된 SQL을 게시해야합니다. – Kawu

답변

4

내 생각에 당신이 사용하고있는 데이터베이스는 당신이 당신의 테이블에 특정 이름을 제공하지 않을 때 얻을 수있는 "user"라는 테이블을 가지고있는 것을 좋아하지 않습니다. Postgres는 "user"가 키워드이기 때문에 "user"테이블을 허용하지 않는다는 것을 알고 있습니다. 나는 MySQL에 대해 잘 모르겠습니다. 사용자 클래스에 @Entity 주석 후 javax.persistence.Table 주석을 추가하십시오 : 당신이 그것을 줄

@Entity 
@Table(name = "my_user") 
public class User extends Model { 
    ... 
} 

하는 것은 당신이이 "사용자"아닙니다 원하는대로 이름을 입력합니다.

@Entity 
@Table(name = "\"user\"") 
public class User extends Model { 
    ... 
} 
1

는 열 이름에주의 : 또는 (하지만 테스트) 당신은 할 수 랩 따옴표에서 "사용자"이름이 될 수 있습니다. 내 경우는 열 "사용자"를 변경했다

2012-08-08T12:58:29+00:00 app[web.1]: 12:58:29,513 ERROR ~ Unsuccessful: create table users (id int8 not null, email varchar(255), enabled bool not null, name varchar(255), user varchar(255), primary key (id)) 
2012-08-08T12:58:29+00:00 app[web.1]: 12:58:29,514 ERROR ~ ERROR: syntax error at or near "user" 

는 "userId를은"

관련 문제