Java 尝试将条件列表结果转换为json时出现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

我创建了一个用于将Hibernate标准列表结果转换为json的应用程序,首先是在我尝试序列化java.lang.Class:org.Hibernate.proxy.HibernateProxy时。忘记注册类型适配器

我下定决心,当我在谷歌上搜索时,我会发现这些东西

现在我得到如下所示的StackOverflower错误

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)将属性分开。这不是最好的方法,但你可以使用它的循环。我不明白这个…你能解释多一点吗