Java 尝试将条件列表结果转换为json时出现StackOverflower错误
我创建了一个用于将Hibernate标准列表结果转换为json的应用程序,首先是在我尝试序列化java.lang.Class:org.Hibernate.proxy.HibernateProxy时。忘记注册类型适配器 我下定决心,当我在谷歌上搜索时,我会发现这些东西 现在我得到如下所示的StackOverflower错误Java 尝试将条件列表结果转换为json时出现StackOverflower错误,java,json,hibernate,criteria,Java,Json,Hibernate,Criteria,我创建了一个用于将Hibernate标准列表结果转换为json的应用程序,首先是在我尝试序列化java.lang.Class:org.Hibernate.proxy.HibernateProxy时。忘记注册类型适配器 我下定决心,当我在谷歌上搜索时,我会发现这些东西 现在我得到如下所示的StackOverflower错误 INFO: HHH000397: Using ASTQueryTranslatorFactory Hibernate: select this_.id
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate:
select
this_.id as id1_1_0_,
this_.base_id as base_id2_1_0_,
this_.name as name3_1_0_
from
testdatabase12.child this_
Hibernate:
select
base0_.id as id1_0_0_,
base0_.name as name2_0_0_
from
testdatabase12.base base0_
where
base0_.id=?
Hibernate:
select
childs0_.base_id as base_id2_0_0_,
childs0_.id as id1_1_0_,
childs0_.id as id1_1_1_,
childs0_.base_id as base_id2_1_1_,
childs0_.name as name3_1_1_
from
testdatabase12.child childs0_
where
childs0_.base_id=?
Exception in thread "main" java.lang.StackOverflowError
at java.util.LinkedHashMap$LinkedHashIterator.<init>(LinkedHashMap.java:345)
at java.util.LinkedHashMap$LinkedHashIterator.<init>(LinkedHashMap.java:345)
at java.util.LinkedHashMap$ValueIterator.<init>(LinkedHashMap.java:387)
at java.util.LinkedHashMap$ValueIterator.<init>(LinkedHashMap.java:387)
at java.util.LinkedHashMap.newValueIterator(LinkedHashMap.java:397)
at java.util.HashMap$Values.iterator(HashMap.java:910)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:203)
at com.dao.HibernateProxyTypeAdapter.write(HibernateProxyTypeAdapter.java:52)
at com.dao.HibernateProxyTypeAdapter.write(HibernateProxyTypeAdapter.java:1)
:
:
Base.java
public class App {
public static void main(String[] args) {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
List names = session.createCriteria(Child.class).list();
GsonBuilder b = new GsonBuilder();
b.registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY);
Gson gson = b.create();
String jsonNames = gson.toJson(names);
System.out.println("jsonNames = " + jsonNames);
session.close();
}
}
public class Base implements java.io.Serializable {
private Integer id;
private String name;
private Set childs = new HashSet(0);
// getters and setters
}
public class Child implements java.io.Serializable {
private Integer id;
private Base base;
private String name;
//getters and setters
}
Base.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Sep 2, 2014 5:23:25 AM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.mappings.Base" table="base" catalog="testdatabase12">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="string">
<column name="name" length="20" />
</property>
<set name="childs" table="child" inverse="true" lazy="true" fetch="select">
<key>
<column name="base_id" />
</key>
<one-to-many class="com.mappings.Child" />
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Sep 2, 2014 5:23:25 AM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.mappings.Child" table="child" catalog="testdatabase12">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<many-to-one name="base" class="com.mappings.Base" fetch="select">
<column name="base_id" />
</many-to-one>
<property name="name" type="string">
<column name="name" length="20" />
</property>
</class>
</hibernate-mapping>
Child.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Sep 2, 2014 5:23:25 AM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.mappings.Base" table="base" catalog="testdatabase12">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="string">
<column name="name" length="20" />
</property>
<set name="childs" table="child" inverse="true" lazy="true" fetch="select">
<key>
<column name="base_id" />
</key>
<one-to-many class="com.mappings.Child" />
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Sep 2, 2014 5:23:25 AM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.mappings.Child" table="child" catalog="testdatabase12">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<many-to-one name="base" class="com.mappings.Base" fetch="select">
<column name="base_id" />
</many-to-one>
<property name="name" type="string">
<column name="name" length="20" />
</property>
</class>
</hibernate-mapping>
我想是关于列表的。您可以使用ArrayList从列表生成JSON 尝试这个代码,我不确定,但当你清除红色标记,它将工作
public class App {
public static void main(String[] args) {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
List names = session.createCriteria(Child.class).list();
GsonBuilder b = new GsonBuilder();
b.registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY);
Gson gson = new Gson();
//seperate adding
gson.toJson("propertyName" , List.get(0).getter...());
gson.toJson("propertyName" , List.get(1).getter...());
session.close();
}
}
改变我的答案。您可以使用List.get(i)将属性分开。这不是最好的方法,但你可以使用它的循环。我不明白这个…你能解释多一点吗