gpt4 book ai didi

Grails:在许多表上的投影?

转载 作者:行者123 更新时间:2023-12-04 06:09:57 25 4
gpt4 key购买 nike

我在 Grails 中的投影有一些问题。你能帮我审查它们并为我提出解决方案吗?

  • 我想查询许多表上的数据,这些表在它们两个的某些属性上具有多对一关系和投影。例如:
    class Person {
    int id
    String name
    String address
    static hasMany = [cars : Car]
    }

    class Car {
    int id
    String brand
    long price
    Person owner
    static belongsTo = [owner : Person]
    }

    那么,如何仅使用一个查询 withCriteria(应用投影)来获取指定汽车的信息(包括品牌、价格和车主姓名)?是否可以使用:
    Car.withCriteria {
    projections {
    property("brand")
    property("price")
    property("owner.name")
    }
    eq("id", carId)
    }
  • 我可以使用投影来获取指定人员的信息以及他所有汽车的名称吗?例如:[01, Perter, 01 Street A, [Mercedes, Toyota, Ducatti]]?
  • 一种特殊情况:(与上面的Person类)
    一个人可以加入多个组织,一个组织可以有一个“父”组织(反之亦然,一个组织可以有许多其他从属组织)。但是有一条规则:一个人只能加入给定组织的一个子组织。因此,对于给定的组织 O 和个人 P,获取 P 的信息以及具有 P 作为成员的 O 的附属组织的名称的最快方法是什么。我更喜欢使用 Grails 投影。

    这是数据模型:
    class Person {
    int id
    String name
    String address
    static hasMany = [joinedOrgs : Organization]
    }

    class Organization {
    int id
    String name
    Organization parentOrg
    static hasMany = [members : Person, childOrgs : Organization]
    }

  • 我是 Grails 的新手,我想更多地了解 GORM。非常感谢你的帮助。

    最佳答案

    对于(1)和(2),我不知道是否有一种方法可以只用 1 个条件查询来做你想做的事,但另一种方法似乎更简单和自然。对于(1):

    def car = Car.get(carId)
    def owners = car.owner?.name

    对于 (2)
    def person = Person.get(personId)
    def cars = person.cars*.name

    关于(3),这是一种设计问题。您当前的域设计并未反射(reflect)您描述的规则,因此很难维持该约束。您可以考虑映射 PersonOrganization 表和 make childrenOrganization a transient property .例如:
    class Organization {
    int id
    String name
    Organization parent
    static transients = ['children']
    ...

    Boolean children() {
    def children = Organization.createCriteria().list() {
    eq ('parent', this)
    }
    return children
    }
    }

    之后,您可以使用像 getAllAncestors() 这样的追溯函数来确定组织的所有父层次结构,并在人员组织列表中查找。这似乎不是最好的方法,但这是一种可能的方法。

    关于Grails:在许多表上的投影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5771627/

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