如何在Guidewire中进行多连接查询?

问题描述 投票:0回答:2

亲爱的 Stackoverflow GW 社区,

我正在尝试有效地查询数据库,以查找具有特定角色并与特定索赔相关的联系人。

在我看来,在 SQL 中执行此类操作的明显方法是在 ClaimContact 上加入 Claim 和 ClaimContactRole 并进行过滤。所以,我尝试了以下方法:

var relevantRoles = {
    ContactRole.TC_INSURED,
    ContactRole.TC_DRIVER,
    ContactRole.TC_WITNESS,
    ContactRole.TC_CLAIMANT
}

var relevantContacts = Query.make(ClaimContact)
    .join("Claim", Claim, "ID")
    .join("Contact", Contact, "ID")
    .join("ID", ClaimContactRole, "ClaimContact")
    .join("Role", ContactRole, "ID")
    .compare(Claim#ID, Equals, claimUnderReview.ID)
    .compareIn("Role", relevantRoles.toArray()).select()*.Contact.toList()

不幸的是,

join()
操作在第二个实体上失败,并显示

java.lang.IllegalArgumentException:找不到列:联系人 .

在数据库级别进行过滤而不是加载和过滤内存中的所有信息的正确方法是什么?

guidewire
2个回答
0
投票

回答关于非法参数异常的问题,我相信这就是错误的原因。如果您不链接连接语句,您就会看到问题。

var claimContactQuery = Query.make(ClaimContact)
var claimTable = claimContactQuery.join("Claim", Claim, "ID")
var contactTable = claimTable.join("Contact", Contact, "ID") //There is no Contact column in the Claim entity

我认为更好的方法是根本不加入联系人实体。看来您只是想通过 ClaimNumber 和角色数组来限制您的结果,并且此信息不存储在 Contact 实体上。当从数据库加载 ClaimContact 实体时(调用

.select()
后),您仍然可以访问所有带有点符号的联系人字段(例如
ClaimContact.Contact.SomeContactProperty
)。

除了过滤数据库中的角色之外,您还可以调用

claim.getContactsWithPreload()
并过滤掉应用程序代码中不需要的联系人。会有一定程度的性能损失,但可能不会那么严重,除非相关索赔有数百个与之相关的联系人。


0
投票

问题似乎出在下面最后一行:

var relevantContacts = Query.make(ClaimContact)
    .join("Claim", Claim, "ID")
    .join("Contact", Contact, "ID")

使用 Claim 加入后,连续的 join 语句预计该加入是针对 Claim 实体而不是 ClaimContact 进行的。由于索赔没有名为“联系人”的列,因此会出现错误。我认为您正在执行一些不需要的额外联接,这是查询的简化版本以实现相同的结果

var relevantContacts = gw.api.database.Query.make(ClaimContactRole)
    .compareIn(ClaimContactRole#Role, relevantRoles.toArray())
    .join(ClaimContactRole#ClaimContact)
    .join(ClaimContact#Claim)
    .compare(Claim#ID, Equals, claimUnderReview.ID)
    .select()*.Contact.toList()
© www.soinside.com 2019 - 2024. All rights reserved.