【问题标题】:Grails 2.5.1 (hibernate 3) criteria multiple joins to same tableGrails 2.5.1(hibernate 3)标准多个连接到同一个表
【发布时间】:2017-01-20 02:00:45
【问题描述】:

我发现了类似的问题,但没有答案。

class SomeDomain {
    static hasMany= [productData:ProductData]
}

ProductData 是简单的类型/值对

我正在尝试查找具有某种类型的多个产品的所有 SomeDomain(在循环中)。目前,标准的相关部分如下所示:

SomeDomain.createCriteria.list {
  somedata.each { type, value ->
    productData {
      eq("type", type)
      eq("value", value)
    }
  }
}

但是,这只会生成一个与 SQL 的连接:

from some_domain this_ inner join product_data productdata_a1_ on this_.id=productdata_a1_.some_domain_id 
where (productdata_a1_.type_id=4 and productdata_a1_.value='GC') 
and (productdata_a1_.type_id=5 and productdata_a1_.value='P1') 

显然 type_id 永远不会成功并且会检查 =4 和 =5...

我真正想要的是 product_data 的两个内部连接......不过,我不知道如何强制这样做。

我试过了 createAlias("productData", "product-${index}") 这给了 org.hibernate.QueryException:重复关联路径:productData

【问题讨论】:

    标签: hibernate grails grails-2.5


    【解决方案1】:

    不确定为什么需要多个连接到同一个表?如果问题理解正确

    String query="from someDomain sd join productData pd where pd.type in (:types) and pd.value in (:values) "
    def inputParams=[:]
    inputParams.values=['GC','P1']
    inputParams.types=[4,5]
    List resultsList = SomeDomain.executeQuery(query,inputParams,[readOnly:true,timeout:15])
    

    pd.type 可能必须是另一个连接,因为在调试中它会尝试获取 .id 所以添加另一个连接

      String query="from someDomain sd join productData pd join pd.types tp where tp.id in (:types) and pd.value in (:values) "
    

    如果您想按照问题中的建议进行多个联接

      String query="from someDomain sd join productData pd join pd.types tp, ProductData pd2 where tp.id in (:types) and pd.value in (:values) and pd2.something=pd.something"
    

    然后查看链接到 someDomain 的 productData,然后再次查找整个 ProductData as pd2,然后确认 pd2.something = pd.something 的位置

    在 HQL 中使用逗号成为与现有查询无关的新查找..

    【讨论】:

    • 我正在尝试在条件查询中执行此操作,而不是 HQL。我可以让它在 HQL 中工作,但这是在一个循环中构建的(所以我可能需要更多连接到同一个表)。两个“ins”不起作用,因为我需要 a.type 来排列 a.value 和 b.type 来匹配 b.value...不能让 a.type 与 b.value 对齐。例如,如果我正在搜索一些包含有 shirt:green 的域,[shirt:blue,pants:green] 会给我错误的 ProductData
    • ...或使用我的样本数据 [4:GC, 5:P1]。我需要一些具有类型 4 产品、值为 GC 和类型 5、值为 P1 的域。 in 解决方案会给我一些类型为 4 的域,值 P1 不正确。
    • 我可以尝试在 HQL 中为您找出一个查询(因为这是我这些天大部分时间都在使用的),但正如您所说,您希望它用于条件查询。就个人而言,我看不出主要的区别。创建的基础查询将引用关闭/类似。如果你需要一个标准查询,我想你需要一个专家。祝你好运。
    • 主要原因是有任意数量的产品......尝试使用 StringBuilder 构建动态 HQL 标准是可能的,但非常难看。此时我已经实现了一个替代解决方案,但我仍然很好奇这是否可以通过条件查询实现。
    猜你喜欢
    • 1970-01-01
    • 2011-10-08
    • 2017-03-13
    • 2011-06-15
    • 2018-12-19
    • 1970-01-01
    • 2018-07-06
    • 2012-04-12
    相关资源
    最近更新 更多