代码之家  ›  专栏  ›  技术社区  ›  Brad Rhoads

有可能投射一个范围吗

  •  0
  • Brad Rhoads  · 技术社区  · 16 年前

    我想这样做:

    def results = Item.findAll("from Item c, Tag b, ItemTag a where c = a.item and  b = a.tag and (b.tag like :q or c.uri like :q) " + ob,[q:q])
    def items = (Item) results[0..1][0]
    

    但我得到

    Cannot cast object '[Ljava.lang.Object;@1e224a5' with class '[Ljava.lang.Object;' to class 'org.maflt.ibidem.Item'
    

    我可以用这个得到我需要的,但这似乎不是最好的解决方案:

    def items = [] as Set
    def cnt = results.size()
    for (i=0;i<cnt-1;i++) { items << results[i][0] }
    items = items as List
    

    更新

    建议使用的解决方案

    def results = Item.findAll("from Item c, Tag b, ItemTag a where c = a.item and  b = a.tag and (b.tag like :q or c.uri like :q) " + ob,[q:q])    
    def items = results[0] as List
    

    不起作用。查询实际上生成正确的sql:

    select
        item0_.id as id3_0_,
        tag1_.id as id16_1_,
        itemtag2_.id as id6_2_,
        item0_.version as version3_0_,
        item0_.last_updated as last3_3_0_,
        item0_.docsize as docsize3_0_,
        item0_.customer_id as customer5_3_0_,
        item0_.uri as uri3_0_,
        item0_.created_by_person_id as created7_3_0_,
        item0_.updated_by_person_id as updated8_3_0_,
        item0_.md5 as md9_3_0_,
        item0_.original_file_name as original10_3_0_,
        item0_.date_created as date11_3_0_,
        item0_.doctype as doctype3_0_,
        item0_.identifier as identifier3_0_,
        tag1_.version as version16_1_,
        tag1_.tagtype_id as tagtype3_16_1_,
        tag1_.tag as tag16_1_,
        tag1_.last_updated as last5_16_1_,
        tag1_.customer_id as customer6_16_1_,
        tag1_.created_by_person_id as created7_16_1_,
        tag1_.updated_by_person_id as updated8_16_1_,
        tag1_.date_created as date9_16_1_,
        itemtag2_.version as version6_2_,
        itemtag2_.updated_by_person_id as updated3_6_2_,
        itemtag2_.weight as weight6_2_,
        itemtag2_.tag_id as tag5_6_2_,
        itemtag2_.item_id as item6_6_2_,
        itemtag2_.last_updated as last7_6_2_,
        itemtag2_.date_created as date8_6_2_,
        itemtag2_.source_id as source9_6_2_,
        itemtag2_.created_by_person_id as created10_6_2_ 
    from
        item item0_,
        tag tag1_,
        item_tag itemtag2_
    where
        item0_.id=itemtag2_.item_id
        and tag1_.id=itemtag2_.tag_id
        and (
            lower(tag1_.tag) like '%english%'
            or lower(item0_.original_file_name) like '%english%'
        ) 
    order by
         item0_.id
    

    但不幸的是,items=results[0]作为列表不起作用。它只返回3行,只有项[0]是项。

    items.each{println it.class}
    

    给予:

    class org.maflt.ibidem.Item
    class org.maflt.ibidem.Tag
    class org.maflt.ibidem.ItemTag
    
    1 回复  |  直到 16 年前
        1
  •  0
  •   lunohodov    16 年前

    当hql选择多个实体时,应该更加具体。以下项目应仅返回:

    def items = Item.executeQuery("select c from Item as c, Tag as b, ItemTag as a where c = a.item and  b = a.tag and (b.tag like :q or c.uri like :q) " + ob,[q:q])
    

    干杯!

    推荐文章