gpt4 book ai didi

grails - 第一次使用FindAllBy延迟获取对象

转载 作者:行者123 更新时间:2023-12-02 14:09:42 25 4
gpt4 key购买 nike

When I use criteria queries, the result contains array list of lazy initialized objects. that is, the list has values with handler org.codehaus.groovy.grails.orm.hibernate.proxy.GroovyAwareJavassistLazyInitializer. This prevent me from doing any array operation (minus, remove etc) in it. When I use, GORM methods, I get array list of actual object types. How can I get the actual objects in criteria query? The code is listed below.

  1. availableTypes = Type.withCriteria() {

    'in'("roleFrom", from)
    'in'("roleTo", to)
    }

availableTypes (an array list) has one value , but not actual object but value with a handler of GroovyAwareJavassistLazyInitializer

  1. availableTypes = Type.findByRoleFrom(from)
    availableTypes (an array list) has values with type Type


----------更新----------
我做了进一步的故障排除,这就是我所发现的。上面的描述可能会引起误解,但我保留了以防万一。
  • 第一次使用findAllBy时,我得到的是代理对象,而不是实际的实例。然后,我通过ajax调用来调用该方法,实际实例已加载(与缓存加载有关系吗?)。当我刷新页面时,它再次加载代理
  • def typeFrom = Type.findAllByParty(partyFrom)
  • 在同一方法中还有findAllBy的另一种用法,该方法始终返回实际实例。
  • def relFrom = Relation.findAllByParty(partyFrom)
  • 与两个类进行比较时,类Roles的属性'party'是1-m关系的一部分。像
  • class Role {
    RoleType roleType

    LocalDate validFrom

    LocalDate validTo

    static belongsTo = [party : Party ]

    ...

    }

    我知道如果我像Party.findAll()这样声明,角色实例将一直是代理,直到它们访问为止。但是,当直接在类(角色)上使用gorm时,为什么我要获得代理对象?

    谢谢您的帮助。

    谢谢。

    最佳答案

    结果是我遇到但没有尝试过的几种可能的解决方案,例如
    -重载equals方法,以便代理和域
    对象使用主键而不是hashCode进行相等性
    -使用联接查询,以便您返回实际实例而不是代理
    -GrailsHibernateUtil.unwrapProxy(o)
    -HibernateProxyHelper.getClassWithoutInitializingProxy(对象)

    对我有用的一种解决方案是在域对象映射中指定lazy loading to be false

    这个问题的历史似乎在这里讨论:GRAILS-4614

    另请参阅:eager load

    关于grails - 第一次使用FindAllBy延迟获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3145694/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com