2017-10-15 145 views
0

許多-to-many關聯我有一個許多一對多協會在同一User實體,以允許用戶跟隨其他用戶。一切都按預期工作。休眠數NamedQuery與同一實體

@ManyToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY) 
@JoinTable(
    name = "user_follower", 
    joinColumns = {@JoinColumn(name="user")}, 
    inverseJoinColumns={@JoinColumn(name="follower")} 
) 
private List<User> followers; 

@ManyToMany(mappedBy="followers", fetch = FetchType.LAZY) 
private List<User> following; 

我試圖讓追隨者的數量的計數分頁。我顯然可以使用User.getFollowers.size()來計數,但這樣相當昂貴。我決定使用命名查詢來代替它,因爲它似乎是合理的做法。

@NamedQuery(
    name = "User.countFollowers", 
    query = "SELECT COUNT(u) FROM User u WHERE u.followers=:userId" 
) 

我知道,因爲我得到一個錯誤,但無法弄清楚如何解決它,這是不對的。這是堆棧跟蹤:

Hibernate: /* User.countFollow */ select count(user0_.id) as col_0_0_ from user user0_ cross join user_follower followers1_, user user2_ where user0_.id=followers1_.user and followers1_.follower=user2_.id and .=? 
DEBUG [2017-10-15 13:36:13,293] org.hibernate.SQL: /* User.countFollow */ select count(user0_.id) as col_0_0_ from user user0_ cross join user_follower followers1_, user user2_ where user0_.id=followers1_.user and followers1_.follower=user2_.id and .=? 
WARN [2017-10-15 13:36:13,345] org.hibernate.engine.jdbc.spi.SqlExceptionHelper: SQL Error: 1064, SQLState: 42000 
ERROR [2017-10-15 13:36:13,346] org.hibernate.engine.jdbc.spi.SqlExceptionHelper: 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 '=1' at line 1 
ERROR [2017-10-15 13:36:13,359] com.xxxx.xxxx.resources.Resource: There was a problem generating a response (SQLGrammarException). Please check the logs 
! com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExceptionxxxx: 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 '=1' at line 1 
! at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
! at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
! at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
! at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
! at com.mysql.jdbc.Util.handleNewInstance(Util.java:404) 
! at com.mysql.jdbc.Util.getInstance(Util.java:387) 
! at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:939) 
! at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878) 
! at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814) 
! at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478) 
! at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625) 
! at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551) 
! at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861) 
! at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1962) 
! at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70) 
! ... 77 common frames omitted 
! Causing: org.hibernate.exception.SQLGrammarException: could not extract ResultSet 
! at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63) 
! at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) 
! at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) 
! at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) 
! at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:79) 
! at org.hibernate.loader.Loader.getResultSet(Loader.java:2115) 
! at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1898) 
! at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1874) 
! at org.hibernate.loader.Loader.doQuery(Loader.java:919) 
! at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336) 
! at org.hibernate.loader.Loader.doList(Loader.java:2610) 
! at org.hibernate.loader.Loader.doList(Loader.java:2593) 
! at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2422) 
! at org.hibernate.loader.Loader.list(Loader.java:2417) 
! at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501) 
! at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371) 
! at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216) 
! at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1339) 
! at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87) 
! at org.hibernate.internal.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:964) 

任何幫助表示讚賞。

+0

錯誤堆棧真的會幫助我們。 –

回答

1

這是用戶和追隨者之間的多對多關係,因此應該在查詢中加入JOIN。

SELECT COUNT(u) FROM User u JOIN u.followers f WHERE u.userId =:userId 

這會查詢特定用戶ID的關注者數量。

+0

我快到了。我有SELECT COUNT(u)FROM用戶u INNER JOIN u.followers fl WHERE fl.user =:userId。顯然沒有工作,但我很高興我接近解決方案,因爲SQL不是我的東西。非常感謝答案的人。 –