2013-04-23 35 views
1

我有一個表「mytable」列「名稱」。我希望查詢以特定字符串開頭的所有行或者在名稱中包含該字符串的所有行,並按照以名稱開頭的行最先排序的方式對它們進行排序。是否有可能只有一個查詢?兩個「喜歡」的查詢合併和排序

我不能使用「union」,我使用Hibernate並且它不受支持。我不希望使用視圖,因爲它們不會被Hibernate二級緩存緩存。

+1

爲什麼你需要Hibernate?爲什麼JDBC和直接的SQL不能管理它?僅僅因爲你使用Hibernate並不意味着它必須是一個全部的或者不是一個命題。 – duffymo 2013-04-23 16:34:18

+1

嘗試按'indexOf(「someString」)排序' – acdcjunior 2013-04-23 16:37:26

+0

dyffymo:我只是說明我的限制,因爲我的特定環境的要求。我可以使用兩個SQL查詢與休眠或使用視圖或去本地SQL與休眠,但這不會在我的情況下理想 – user979051 2013-04-23 16:41:16

回答

0

也許這樣的事情可以工作?

select nvl(mytable1.name, '') || nvl(mytable2.name, '') as name, 
nvl(mytable1.i, '') || nvl(mytable2.i, '') as i from 
(select 1 as i, name from mytable where name like ('string%')) mytable1 
full outer join 
(select 2 as i, name from mytable where name like ('%string%')) mytable2 
where (mytable1.name is null or mytable2.name is null) 
and mytable1.name != mytable2.name 
order by i, name 

但我想我會用下列之一:

  • 與工會一個簡單的查詢此查詢
  • 一種在Java中,而是和做它爲200個查詢。
0

在Oracle中,你可以這樣做:

select * 
    from myTable mt 
where mt.column like '%TargetString%' 
order by instr(mt.column, 'TargetString') 

如果您正在使用Hibernate +甲骨文,它支持在方言instr功能。

我相信其他RDBMSs也有類似的功能,這可能是Hibernate方言支持的。

+0

我正在使用MySQL ..問題被標記。謝謝你。 – user979051 2013-04-23 17:34:30

-1

編輯:既然你已經厭惡利用多個標準查詢 - 不管是什麼原因 - 我建議在Order類閱讀起來。它不會爲你提供你想要的。這給你留下了幾個選擇。

一個選項是槓桿Hibernate Search

另一種方法是利用Hibernate進行查詢,然後利用Collections.sort(...)進行排序。

List<MyObject> lstMyObject = ...; 
Collections.sort(lstMyObject, new Comparator<MyObject>() { 
    @Override 
    public int compare(MyObject o1, MyObject o2) { 
     // Assuming 'argument' is passed to this method and defined as 'final' 
     return o1.getName().startsWith(argument) && o2.getName().startsWith(argument) ? 0 : 
      o1.getName().startsWith(argument) ? -1 : 1; 
    } 
} 

這滿足你的要求1)中使用Hibernate,2)不使用多個查詢,3)不使用本地SQL,4)不使用的意見,5)不使用 '聯盟'。


我的建議是兩個查詢,東西

public List<MyObject> findMyObjects(...) { 
    Criteria queryStartsWith = sf.getCurrentSession().createCriteria(MyObject.class) 
     .add(Restrictions.like("myProperty",nameArgument,MatchMode.START)) 
     .addOrder(Order.desc); 

    Criteria queryLike = sf.getCurrentSession().createCriteria(MyObject.class) 
     .add(Restrictions.like("myProperty",nameArgument,MatchMode.ANYWHERE)) 
     .addOrder(Order.desc); 

    List<MyObject> lstMyObject = new ArrayList<MyObject>(); 
    for (Object curObject : queryStartWith.list()) 
     if (curObject instanceOf MyObject) 
      lstMyObject.add((MyObject) curObject); 

    for (Object curObject : queryLike.list()) 
     if (curObject instanceOf MyObject) 
      lstMyObject.add((MyObject) curObject); 

    return lstMyObject; 
} 

我不知道Hibernate會滿足您的條件排序。 org.hibernate.criterion.Order類是相當有限的,說實話。

除了使用原生SQL,這是我能想到的唯一選項。

+0

我知道兩個查詢方法..要求one..btw所有的循環和實例檢查是完全不必要的..queryStartsWith.list()。add(queryLike.list())將做 – user979051 2013-04-23 17:37:14

+0

我道歉。你沒有指定你不想使用兩個Criteria Queries,只是你想使用Hibernate。 downvoted的人應該忙於其他答案。至少這會利用Hibernate(哪個*被請求),而不是恢復到原生SQL。 – Mike 2013-04-23 17:43:19