Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate-减少查询的数量_Java_Hibernate - Fatal编程技术网

Java hibernate-减少查询的数量

Java hibernate-减少查询的数量,java,hibernate,Java,Hibernate,一个产品可以有一个或多个子产品形成树状结构。子产品也将引用父产品。在我的测试代码中,我创建了一个家长(mortgage)和两个孩子(ml和me)。为什么我尝试加载父级Product entity=(Product)hibernateTemplate.get(Product.class,mortgage.getId())它正在正确使用连接 然而,hibernate也在尝试加载ml和me的子项,即使它们都没有任何子项。有没有办法避免这种情况,这样我就可以将查询的数量从3个减少到1个 生成的SQL使用

一个产品可以有一个或多个子产品形成树状结构。子产品也将引用父产品。在我的测试代码中,我创建了一个家长(
mortgage
)和两个孩子(
ml和me
)。为什么我尝试加载父级
Product entity=(Product)hibernateTemplate.get(Product.class,mortgage.getId())它正在正确使用连接

  • 然而,hibernate也在尝试加载
    ml和me
    的子项,即使它们都没有任何子项。有没有办法避免这种情况,这样我就可以将查询的数量从3个减少到1个

  • 生成的SQL使用动态生成的别名,如
    children0\u0
    。有没有办法让hibernate使用我自己的别名说“p”

  • 这是我的hbm和测试代码

    hbm

    <class name="Product" table="PRODUCT">
            <id name="id" type="java.lang.Long" column="ID">
                <generator class="native">
                    <param name="sequence">PRODUCT_SN</param>
                </generator>
            </id>
    
            <many-to-one name="parent" class="Product" lazy="false" column="PARENT" />
    
            <set name="children" lazy="false" fetch="join"  table="PRODUCT" cascade="all">
                <key>
                    <column name="PARENT" />
                </key>
                <one-to-many class="Product" />
            </set>
            <property name="code" type="java.lang.String" column="CODE" not-null="true" />
            <property name="name" type="java.lang.String" column="NAME" />
            <property name="startDate" type="java.util.Date" column="STARTDATE" />
            <property name="endDate" type="java.util.Date" column="ENDDATE" />
            <property name="decisionable" type="boolean" column="ISDECISIONABLE" />
            <property name="selectable" type="boolean" column="ISSELECTABLE" />
        </class>
    
    日志

    Hibernate: select product0_.ID as ID0_1_, product0_.PARENT as PARENT0_1_, product0_.CODE as CODE0_1_, product0_.NAME as NAME0_1_, product0_.STARTDATE as STARTDATE0_1_, product0_.ENDDATE as ENDDATE0_1_, product0_.ISDECISIONABLE as ISDECISI7_0_1_, product0_.ISSELECTABLE as ISSELECT8_0_1_, children1_.PARENT as PARENT3_, children1_.ID as ID3_, children1_.ID as ID0_0_, children1_.PARENT as PARENT0_0_, children1_.CODE as CODE0_0_, children1_.NAME as NAME0_0_, children1_.STARTDATE as STARTDATE0_0_, children1_.ENDDATE as ENDDATE0_0_, children1_.ISDECISIONABLE as ISDECISI7_0_0_, children1_.ISSELECTABLE as ISSELECT8_0_0_ from PRODUCT product0_ left outer join PRODUCT children1_ on product0_.ID=children1_.PARENT where product0_.ID=?
    DEBUG [org.hibernate.type.LongType] binding '1' to parameter: 1
    
    DEBUG [org.hibernate.type.LongType] returning '2' as column: ID0_0_
    DEBUG [org.hibernate.type.LongType] returning '1' as column: PARENT0_0_
    DEBUG [org.hibernate.type.StringType] returning 'Mortgage Loan' as column: CODE0_0_
    DEBUG [org.hibernate.type.StringType] returning null as column: NAME0_0_
    DEBUG [org.hibernate.type.TimestampType] returning null as column: STARTDATE0_0_
    DEBUG [org.hibernate.type.TimestampType] returning null as column: ENDDATE0_0_
    DEBUG [org.hibernate.type.BooleanType] returning 'false' as column: ISDECISI7_0_0_
    DEBUG [org.hibernate.type.BooleanType] returning 'false' as column: ISSELECT8_0_0_
    
    DEBUG [org.hibernate.type.LongType] returning null as column: PARENT0_1_
    DEBUG [org.hibernate.type.StringType] returning 'Mortgage' as column: CODE0_1_
    DEBUG [org.hibernate.type.StringType] returning null as column: NAME0_1_
    DEBUG [org.hibernate.type.TimestampType] returning null as column: STARTDATE0_1_
    DEBUG [org.hibernate.type.TimestampType] returning null as column: ENDDATE0_1_
    DEBUG [org.hibernate.type.BooleanType] returning 'false' as column: ISDECISI7_0_1_
    DEBUG [org.hibernate.type.BooleanType] returning 'false' as column: ISSELECT8_0_1_
    
    DEBUG [org.hibernate.type.LongType] returning '1' as column: PARENT3_
    DEBUG [org.hibernate.type.LongType] returning '2' as column: ID3_
    DEBUG [org.hibernate.type.LongType] returning '3' as column: ID0_0_
    DEBUG [org.hibernate.type.LongType] returning '1' as column: PARENT0_0_
    DEBUG [org.hibernate.type.StringType] returning 'Home Equity LOC' as column: CODE0_0_
    DEBUG [org.hibernate.type.StringType] returning null as column: NAME0_0_
    DEBUG [org.hibernate.type.TimestampType] returning null as column: STARTDATE0_0_
    DEBUG [org.hibernate.type.TimestampType] returning null as column: ENDDATE0_0_
    DEBUG [org.hibernate.type.BooleanType] returning 'false' as column: ISDECISI7_0_0_
    DEBUG [org.hibernate.type.BooleanType] returning 'false' as column: ISSELECT8_0_0_
    DEBUG [org.hibernate.type.LongType] returning '1' as column: PARENT3_
    DEBUG [org.hibernate.type.LongType] returning '3' as column: ID3_
    
    Hibernate: select children0_.PARENT as PARENT1_, children0_.ID as ID1_, children0_.ID as ID0_0_, children0_.PARENT as PARENT0_0_, children0_.CODE as CODE0_0_, children0_.NAME as NAME0_0_, children0_.STARTDATE as STARTDATE0_0_, children0_.ENDDATE as ENDDATE0_0_, children0_.ISDECISIONABLE as ISDECISI7_0_0_, children0_.ISSELECTABLE as ISSELECT8_0_0_ from PRODUCT children0_ where children0_.PARENT=?
    DEBUG [org.hibernate.type.LongType] binding '3' to parameter: 1
    
    Hibernate: select children0_.PARENT as PARENT1_, children0_.ID as ID1_, children0_.ID as ID0_0_, children0_.PARENT as PARENT0_0_, children0_.CODE as CODE0_0_, children0_.NAME as NAME0_0_, children0_.STARTDATE as STARTDATE0_0_, children0_.ENDDATE as ENDDATE0_0_, children0_.ISDECISIONABLE as ISDECISI7_0_0_, children0_.ISSELECTABLE as ISSELECT8_0_0_ from PRODUCT children0_ where children0_.PARENT=?
    DEBUG [org.hibernate.type.LongType] binding '2' to parameter: 1
    

    您可能应该将关系标记为lazy,以便仅在必要时加载子对象。 如果要加载节点及其子节点,请使用专用查询:

    select p from Product left join fetch p.children where p.id = :id
    

    我认为你看到所有
    孩子的原因是你在
    中定义了
    fetch=“join”
    。如果你把它去掉,我想Hibernate只会拉
    产品

    ,我不希望他们懒惰。我只是想知道是否有办法告诉hibernate抑制最后两个sql。不,如果要抑制它们,应该使用延迟抓取。您可以在模型中配置它,也可以将其配置为此特定查询的获取配置文件(以便它在应用程序中的任何其他地方都可以使用)。
    select p from Product left join fetch p.children where p.id = :id