【问题标题】:Can't get proper resultSet with hibernate无法通过休眠获得正确的结果集
【发布时间】:2016-10-24 04:13:39
【问题描述】:

我有 3 个表,Groupes、Assignements 和 Assignements_has_group,它们在前面的表之间进行链接(多对多关系)。 我想要做的是将idgroupes 放入Assignement_has_groupes 表中以获取idAssignements,然后能够通过它们的ID 加载assignements。

我已经从 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 访问表,但我无法获得正确的结果集, 我的代码是:

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 哪种解决方案是最好的,怎么做?

编辑: 休眠配置

<?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)

【问题讨论】:

  • 你能发布你的entities吗?你的预期结果是什么?你得到了什么?
  • 你能显示你的休眠配置文件吗?

标签: java mysql hibernate jakarta-ee many-to-many


【解决方案1】:

使用 Hibernate 处理任何数据库关系的最佳方式是让它为您服务。这必须在映射中指定,很难。在 Hibernate 中,您可以定义两种映射:通过 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,表 Assignements_has_group 在列 ASSIGNMENT_ID 和 GROUP_ID 上映射了多对多关系。 此外,如果关系表不包含 null 元素并且您不想更新该表的记录,您可能需要设置 nullable = false 和 updatable = false。您必须为 Assignment 模型和 Group 模型执行此操作。

完成此操作后,要获取数据,您不会使用联接表,而是使用 Groupes 和 Assignments 表。这是获取组“testGroup”的所有分配的 HQL 查询示例:

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/

【讨论】:

  • 参数“testGroup”代表什么?
  • 它代表您正在寻找任务的组。实际上,该查询将返回已分配给“testGroup”的所有元素。
  • 很高兴能为您提供帮助! :)
猜你喜欢
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 2013-10-02
  • 2015-03-12
相关资源
最近更新 更多