tags:

views:

62

answers:

1

I'd like to do something like this:

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]

but I get

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

I can get what I need with this, but it doesn't seem like it's the best solution:

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

UPDATE

The solution suggested to use

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

doesn't work. The query actually produces the correct 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

But unfortunately the items = results[0] as List doesn't work. It only returns 3 rows and only items[0] is an Item.

items.each{println it.class}

gives:

class org.maflt.ibidem.Item
class org.maflt.ibidem.Tag
class org.maflt.ibidem.ItemTag
A: 

As your HQL selects several entities, you should be more specific. The following should return only items:

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])

Cheers!

lunohodov
Thanks for your reply.When there's more than one table in the query, as in the question above, findAll returns an n dimensional array of objects, which you need to cast.I need to grab just the items, e.g (Item) results[0][0] gives the first item. So it seems like (Item) results[0..results.size()-1][0] should give me all the items. But it doesn't work.
Brad Rhoads
@Brad: I just had my "Aha!" moment... I didn't know that :) Thanks! I updated my answer.
lunohodov
It seems like that should work, but no dice :(. Please see the update to the question.Thanks again.
Brad Rhoads
I updated my answer accordingly. Cheers
lunohodov