簡體   English   中英

通過查詢休眠多對多數據

[英]Hibernate many-to-many data retrieval, via query

請幫助我,我認為我做的不正確。 我有“ User和“ Contact ,它們具有Many-to-Many關系。

User.java:

public class User {

    private Integer userID;

    private String userLoginEmail;

    private Set<Contact> contactSet = new HashSet<Contact>();

    public User() {

    }

    .
    getters and setters
    .

Contact.java

public class Contact implements Serializable {
    private Integer contactID;
    private Set<User> userSet= new HashSet<User>();
    public Contact() {
    }
    .
    getters and setters
    .
    .

用戶映射:

<hibernate-mapping package="com.smallworks.model" schema="projectdb">
 <class name="User" table="USERACCOUNT">
  <id column="USER_ID" length="500" name="userID">
   <generator class="increment"/>
  </id>
  <set cascade="all" fetch="select" lazy="true" name="contactSet"
   sort="unsorted" table="USER_CONTACT">
   <key column="USER_ID"/>
   <many-to-many class="com.smallworks.model.Contact"
    column="CONTACT_ID" order-by="CONTACT_ID" unique="false"/>
  </set>
  </class>
</hibernate-mapping>

映射聯系人:

<hibernate-mapping package="com.smallworks.model" schema="projectdb">
 <class name="Contact" table="CONTACT">
  <id column="CONTACT_ID" length="500" name="contactID">
   <generator class="increment"/>
  </id>
  <!-- many to many mapping with the User via User_Contact table -->
  <set inverse="true" lazy="false" name="userSet" sort="unsorted" table="USER_CONTACT">
    <key column="USER_ID"/>
    <many-to-many class="com.smallworks.model.Contact" column="CONTACT_ID" unique="false"/>
  </set>
 </class>
</hibernate-mapping>

我正在嘗試編寫查詢以獲取與登錄User相關聯的Contacts

當我嘗試編寫以下查詢時:

Query query=session.createQuery("select contact from com.src.model.Contact  contact join contact.userSet u where u.userID=:userID");
        query.setParameter("userID", user.getUserID());
        contactList=query.list();

我收到以下錯誤:

org.hibernate.QueryException: could not resolve property: userID of: com.src.model.Contact [select contact from com.src.model.Contact  contact join contact.userSet u where u.userID=:userID]

我知道錯誤消息的含義,但是我無法弄清楚如何編寫此查詢。

首先,我確實是這樣的: 休眠多對多數據檢索

但是現在我正在寫查詢,因為我需要檢查Contact狀態和其他參數。

謝謝哈比爾

這就是我調用查詢的方式:

@Override
    public List<Contact> getContactList(User user) {
        log.info("getContactList(User user)");
        List contactList = new ArrayList();
        Session session = sessionFactory.getCurrentSession();
        System.out.println("About to hit the query");
        Query query=session.createQuery("select contact from com.smallworks.model.Contact  contact join contact.userSet u where u.userID=:userID");
        query.setParameter("userID", user.getUserID());
        contactList=query.list();
        return contactList;
    }

以下是堆棧跟蹤:

About to hit the query
18:56:01.011 [http-bio-8080-exec-6] DEBUG o.h.hql.ast.QueryTranslatorImpl - parse() - HQL: select contact from com.smallworks.model.Contact  contact join contact.userSet u where u.userID=:userID
18:56:01.020 [http-bio-8080-exec-6] DEBUG org.hibernate.hql.ast.AST - --- HQL AST ---
 \-[QUERY] 'query'
    +-[SELECT_FROM] 'SELECT_FROM'
    |  +-[FROM] 'from'
    |  |  +-[RANGE] 'RANGE'
    |  |  |  +-[DOT] '.'
    |  |  |  |  +-[DOT] '.'
    |  |  |  |  |  +-[DOT] '.'
    |  |  |  |  |  |  +-[IDENT] 'com'
    |  |  |  |  |  |  \-[IDENT] 'smallworks'
    |  |  |  |  |  \-[IDENT] 'model'
    |  |  |  |  \-[IDENT] 'Contact'
    |  |  |  \-[ALIAS] 'contact'
    |  |  \-[JOIN] 'join'
    |  |     +-[DOT] '.'
    |  |     |  +-[IDENT] 'contact'
    |  |     |  \-[IDENT] 'userSet'
    |  |     \-[ALIAS] 'u'
    |  \-[SELECT] 'select'
    |     \-[IDENT] 'contact'
    \-[WHERE] 'where'
       \-[EQ] '='
          +-[DOT] '.'
          |  +-[IDENT] 'u'
          |  \-[IDENT] 'userID'
          \-[COLON] ':'
             \-[IDENT] 'userID'

18:56:01.020 [http-bio-8080-exec-6] DEBUG org.hibernate.hql.ast.ErrorCounter - throwQueryException() : no errors
18:56:01.041 [http-bio-8080-exec-6] DEBUG o.h.hql.antlr.HqlSqlBaseWalker - select << begin [level=1, statement=select]
18:56:01.050 [http-bio-8080-exec-6] DEBUG o.hibernate.hql.ast.tree.FromElement - FromClause{level=1} :  com.smallworks.model.Contact (contact) -> contact0_
18:56:01.051 [http-bio-8080-exec-6] DEBUG o.h.hql.ast.tree.FromReferenceNode - Resolved :  contact -> contact0_.CONTACT_ID
18:56:01.053 [http-bio-8080-exec-6] DEBUG org.hibernate.hql.ast.tree.DotNode - getDataType() : userSet -> org.hibernate.type.SetType(com.smallworks.model.Contact.userSet)
18:56:01.053 [http-bio-8080-exec-6] DEBUG o.h.hql.ast.tree.FromElementFactory - createManyToMany() : path = contact.userSet role = com.smallworks.model.Contact.userSet associatedEntityName = com.smallworks.model.Contact
18:56:01.055 [http-bio-8080-exec-6] DEBUG o.hibernate.hql.ast.tree.FromElement - FromClause{level=1} :  com.smallworks.model.Contact (u) -> contact2_
18:56:01.055 [http-bio-8080-exec-6] DEBUG o.hibernate.hql.ast.tree.FromClause - addJoinByPathMap() : contact.userSet -> smallworksdb.CONTACT contact2_
18:56:01.055 [http-bio-8080-exec-6] DEBUG org.hibernate.hql.ast.tree.DotNode - dereferenceCollection() : Created new FROM element for contact.userSet : smallworksdb.USER_CONTACT contact2_
18:56:01.055 [http-bio-8080-exec-6] DEBUG o.h.hql.ast.tree.FromReferenceNode - Resolved :  contact.userSet -> .
18:56:01.056 [http-bio-8080-exec-6] DEBUG org.hibernate.hql.ast.HqlSqlWalker - createFromJoinElement() : -- join tree --
 \-[JOIN_FRAGMENT] FromElement: 'smallworksdb.USER_CONTACT contact2_' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=u,role=com.smallworks.model.Contact.userSet,tableName=smallworksdb.CONTACT,tableAlias=contact2_,origin=smallworksdb.CONTACT contact0_,colums={contact0_.CONTACT_ID ,className=com.smallworks.model.Contact}}

18:56:01.056 [http-bio-8080-exec-6] DEBUG o.h.hql.ast.tree.FromReferenceNode - Resolved :  contact -> contact0_.CONTACT_ID
18:56:01.060 [http-bio-8080-exec-6] DEBUG o.h.hql.ast.tree.FromReferenceNode - Resolved :  u -> contact2_.CONTACT_ID
18:56:01.060 [http-bio-8080-exec-6] DEBUG o.s.w.s.m.a.AnnotationMethodHandlerExceptionResolver - Resolving exception from handler [com.smallworks.controller.ProjectController@1f183871]: org.hibernate.QueryException: could not resolve property: userID of: com.smallworks.model.Contact [select contact from com.smallworks.model.Contact  contact join contact.userSet u where u.userID=:userID]
18:56:01.062 [http-bio-8080-exec-6] DEBUG o.s.w.s.m.a.ResponseStatusExceptionResolver - Resolving exception from handler [com.smallworks.controller.ProjectController@1f183871]: org.hibernate.QueryException: could not resolve property: userID of: com.smallworks.model.Contact [select contact from com.smallworks.model.Contact  contact join contact.userSet u where u.userID=:userID]
18:56:01.062 [http-bio-8080-exec-6] DEBUG o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolving exception from handler [com.smallworks.controller.ProjectController@1f183871]: org.hibernate.QueryException: could not resolve property: userID of: com.smallworks.model.Contact [select contact from com.smallworks.model.Contact  contact join contact.userSet u where u.userID=:userID]
18:56:01.069 [http-bio-8080-exec-6] DEBUG o.s.web.servlet.DispatcherServlet - Could not complete request
org.hibernate.QueryException: could not resolve property: userID of: com.smallworks.model.Contact [select contact from com.smallworks.model.Contact  contact join contact.userSet u where u.userID=:userID]
    at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:67) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:61) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1385) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.persister.collection.AbstractCollectionPersister.toType(AbstractCollectionPersister.java:1457) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:302) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:407) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.ast.tree.DotNode.getDataType(DotNode.java:589) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.ast.tree.DotNode.prepareLhs(DotNode.java:264) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:211) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:117) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:113) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:750) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1216) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4041) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3525) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1762) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:776) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:577) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:251) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:134) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1650) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
    at com.smallworks.dao.impl.ContactDAOImpl.getContactList(ContactDAOImpl.java:92) [ContactDAOImpl.class:na]
    at com.smallworks.service.impl.ContactServiceImpl.getContactList(ContactServiceImpl.java:95) [ContactServiceImpl.class:na]
    at com.smallworks.controller.ProjectController.addContact(ProjectController.java:117) [ProjectController.class:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [na:1.6.0_33]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [na:1.6.0_33]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [na:1.6.0_33]
    at java.lang.reflect.Method.invoke(Unknown Source) [na:1.6.0_33]
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) [spring-web-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) [spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) [spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) [spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) [spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) [spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) [spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) [servlet-api.jar:na]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) [servlet-api.jar:na]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) [catalina.jar:7.0.33]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.33]
    at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) [spring-orm-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) [spring-web-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) [catalina.jar:7.0.33]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.33]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) [catalina.jar:7.0.33]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) [catalina.jar:7.0.33]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) [catalina.jar:7.0.33]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) [catalina.jar:7.0.33]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) [catalina.jar:7.0.33]
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:931) [catalina.jar:7.0.33]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) [catalina.jar:7.0.33]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) [catalina.jar:7.0.33]
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) [tomcat-coyote.jar:7.0.33]
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) [tomcat-coyote.jar:7.0.33]
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) [tomcat-coyote.jar:7.0.33]
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) [na:1.6.0_33]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.6.0_33]
    at java.lang.Thread.run(Unknown Source) [na:1.6.0_33]
18:56:01.069 [http-bio-8080-exec-6] DEBUG o.s.o.h.s.OpenSessionInViewFilter - Closing single Hibernate Session in OpenSessionInViewFilter
18:56:01.069 [http-bio-8080-exec-6] DEBUG o.s.o.hibernate3.SessionFactoryUtils - Closing Hibernate Session

在XML映射聯系人中,userSet的映射完全錯誤:

<hibernate-mapping package="com.smallworks.model" schema="projectdb">
 <class name="Contact" table="CONTACT">
  <!-- ... --->
  <set inverse="true" lazy="false" name="userSet" sort="unsorted" table="USER_CONTACT">
    <key column="USER_ID"/>
    <many-to-many class="com.smallworks.model.Contact" column="CONTACT_ID" unique="false"/>
  </set>
 </class>
</hibernate-mapping>

它應該是:

  <set inverse="true" lazy="false" name="userSet" sort="unsorted" table="USER_CONTACT">
    <key column="CONTACT_ID"/>
    <many-to-many class="com.smallworks.model.User" column="USER_ID" unique="false"/>
  </set>

在我看來,您好像從User復制並粘貼了此內容,然后沒有對其進行更新。

為什么要使用XML而不是注釋? 如您所見,XML更容易出錯。 另外,許多這些設置應該由Hibernate正確地默認。 如果您只是省略了其中一些屬性,則可能效果很好。

讓我們看看我是否理解正確。 您要“獲取與已登錄用戶關聯的聯系人”。 “我需要檢查聯系狀態...”,對嗎?

如果是這種情況,請嘗試以其他方式編寫查詢。 因此,您可以從此處的相同查詢開始。 假設您想要“已登錄用戶的所有狀態為“ ACTIVE”的聯系人”。

// First, retrieve the user you want.
User user = (User) session.get(User.class, user_id_you_want);
// Return only the conctats with status 'ACTIVE' 
List result = new ArrayList();
for(Contact c : contacts){
  if(c.getStatus().equals("ACTIVE")){
    result.add(c);
  }
}
return result;

希望對您有幫助...

=== UPDATE1 ===

沒錯,我認為一個用戶會有幾個聯系人。 如果您嘗試類似的操作:

"FROM com.smallworks.model.User as u LEFT JOIN u.contacts as c WHERE u.userId=:userId AND c.status=:status"

請注意,您可以使用“ FROM”而不是“ SELECT”開始語句。 請參閱本教程中的一些很好的示例。

另一個重要參考: http : //docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

另外,請注意,在您的情況下,類User擁有該關系,某些語句需要考慮所有權。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM