我有3个表,Groupes,Assignements和Assignements_has_group,它们正在进行之前的连接(多对多关系)。 我想要做的是将idgroupes放入Assignement_has_groupes表中以获取idAssignements,然后通过他们的ID加载分配。
我已经从Hibernate生成了我的类和映射,并且它没有创建类Assignements_has_group或hbm.xml文件,但它是正常的。 我的问题是当我试图通过
访问表来获取数据时ArrayList<Integer> A = (Integer) session.createQuery("FROM Assignements_has_groupes WHERE Groupes_idGroupes="+"'"+id+"'").list();
我收到一条错误消息,指出没有映射Assignements_has_groupes。
所以我试图通过本机SQL访问该表但是我无法获得正确的Resultset, 我的代码是:
ArrayList AS = new ArrayList<Integer>();
ResultSet AB= (ResultSet)session.createSQLQuery("SELECT * FROM assignements_has_table WHERE Groupes_idGroupes="+"'"+id+"'").list();
tx.commit();
int x=0;
while(AB.next()){
int c =(int)AB.getInt(x);
AS.add(c);
x++;
}
我没有实现将结果集正确地放入arrayList中 哪种解决方案最好,怎么做?
编辑: hibernate config
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb</property>
<property name="hibernate.connection.username">root</property>
<property name="connection.password"></property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop the existing tables and create new one -->
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.current_session_context_class">thread</property>
<!-- Mention here all the model classes along with their package name -->
<!-- <mapping class="com.isep.metier.entities.Competences2"/> -->
<mapping resource="com/isep/metier/Users.hbm.xml"/>
<mapping resource="com/isep/metier/Absences.hbm.xml"/>
<mapping resource="com/isep/metier/Assignements.hbm.xml"/>
<mapping resource="com/isep/metier/Competences.hbm.xml"/>
<mapping resource="com/isep/metier/Competencesgrp.hbm.xml"/>
<mapping resource="com/isep/metier/Famillecompetences.hbm.xml"/>
<mapping resource="com/isep/metier/Famillecompetencesgrp.hbm.xml"/>
<mapping resource="com/isep/metier/Groupes.hbm.xml"/>
<mapping resource="com/isep/metier/Notes.hbm.xml"/>
<mapping resource="com/isep/metier/Remarques.hbm.xml"/>
</session-factory>
</hibernate-configuration>
我最终想要的是int idAssignement的ArrayList,以便我能够正确加载分配
现在,完整的堆栈错误是:
Hibernate: SELECT * FROM assignements_has_groupes WHERE Groupes_idGroupes='1'
juin 22, 2016 12:16:57 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: "Servlet.service()" pour la servlet GroupeEleve a généré une exception
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.sql.ResultSet
at com.isep.metier.AssignementsUtil.AssignementByGrp(AssignementsUtil.java:48)
at com.isep.controlleurs.GroupeEleve.doGet(GroupeEleve.java:49)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
答案 0 :(得分:1)
处理与Hibernate的任何数据库关系的最佳方法是让它为您做。这必须在映射中指定,很难。在Hibernate中,您可以定义两种映射:via xml或Java注释。对于下一个示例,我将使用注释,最后我将留下两个链接,解释这两种方法和更多示例。
在您的具体情况中,我们讨论的是两个表之间的多对多关系。这意味着第一个表的每个元素可以包含来自第二个表的更多元素,反之亦然。从Java的角度来看,这是由Collection定义的。在这种情况下,我将使用一套。
public Assignment {
// Your model.
...
@ManyToMany
@JoinTable(name = "Assignements_has_group ", joinColumns = {
@JoinColumn(name = "ASSIGNMENT_ID", nullable = false, updatable = false) },
inverseJoinColumns = { @JoinColumn(name = "GROUP_ID",
nullable = false, updatable = false) })
public Set<Group> groupes;
}
基本上,这将告诉Hibernate在列ASSIGNMENT_ID和GROUP_ID上由表Assignements_has_group映射的多对多关系。 此外,如果关系表不包含空元素并且您不想更新该表的记录,则可能需要设置nullable = false和updatable = false。您必须为Assignment模型和Group模型执行此操作。
完成此操作后,要获取数据,您不会使用连接表,而是使用Groupes和Assignments表。这是HQL查询的一个示例,它获取该组的所有分配&#34; testGroup&#34;:
String hql = "from Assignment a where :myGroup in elements(a.groupes)";
List result = session.createQuery(hql)
.setString("myGroup", "testGroup")
.list();
<强>声明强>
请注意,此代码是动态编写的,未经过测试,因此可能包含错误,可能无法正常工作。这只是为了给出一个大致的想法。如果您遇到更多问题,请查看以下链接以获得更好的教程。
来源及更多示例
注释:http://www.mkyong.com/hibernate/hibernate-many-to-many-relationship-example-annotation/
XML:http://www.mkyong.com/hibernate/hibernate-many-to-many-relationship-example/