總結DetachedCriteria級聯查詢

2021-08-23 15:53:11 字數 1875 閱讀 6119

[b]如果實體物件中沒有關聯物件的情況[/b]使用detachedcriteria進行查詢是一件很簡單的事情。

假設要通過stuname查詢乙個學生student記錄,可以如下:

detachedcriteria dc = detachedcriteria.forclass(student.class);

dc.add(restrictions.like("stuname", stuname, matchmode.anywhere));

如果要通過student的team的teamname查詢乙個student記錄,很多人都會這麼寫:

detachedcriteria dc = detachedcriteria.forclass(student.class);

dc.add(restrictions.like("team.teamname", teamname, matchmode.anywhere));

遺憾的是上述程式報錯,說是在student中找不到team.teamname屬性,這是可以理解的。那麼如何通過teamname查詢student呢?

可以這麼寫:

detachedcriteria dc = detachedcriteria.forclass(student.class);

dc.createalias("team", "t");

dc.add(restrictions.like("t.teamname", teamname, matchmode.anywhere));

沒錯,就是要先建立team的引用,才能用team導航到teamname。

這裡有乙個特殊情況,如果是對引用物件的id查詢,則可以不用建立引用,也就是可以不呼叫createalias()語句,如下所示:

detachedcriteria dc = detachedcriteria.forclass(student.class);

dc.add(restrictions.like("team.id", teamid, matchmode.anywhere));

據我個人的經驗,team後只能跟其主鍵屬性,比較其他屬性要用別名。此主鍵屬性可以用「id」字元來指代,也可以用team的主鍵屬性來指代。換句話說,我的student類的類主鍵「stuid」,不管是在hql還是在qbc中,都可以用stu.id來指代stu.stuid。在這裡可以看出 「id」字元的特殊性。上述是個人觀點,並未得到確實的證實。

補充:[b]如果是**或更多級查詢怎麼辦?[/b]

以**查詢為例,仍引用上面的例子:

detachedcriteria dc = detachedcriteria.forclass(student.class);

dc.createalias("team", "t");

dc.createalias("t.school", "s");

dc.add(restrictions.like("s.schoolname", schoolname, matchmode.anywhere));

[b]如果實體物件中含有onetomany關聯物件的情況,既是實體中含有list或set等關聯實體集合的情況下怎麼辦呢?[/b]

這個還不知道怎麼辦,呵呵

方法其實是非常簡單的:

dc.createalias("tags", "t");

dc.add(restrictions.eq("t.id", tagid));

其中tags是個set,但是想查詢屬性tags中含有id為tagid的實體,使用上面的就可以了。

總結之總結

這週都在為前一段時間的工作進行總結,雖然沒有時間壓力,但是還是讓我感覺煩惱,特別是在開始階段,面對一堆資料無從下手,時間過半,還是沒有清晰的思路。現在總結雖然寫完了,但還是有些不爽,想在這裡吐吐槽,希望日後的總結工作能夠更加順利一些。現在回想起來,在總結開始的時候,我有幾個疑惑,這次總結的目標是什麼...

總結 C 總結!!!

基礎 引數列表 c語言 沒有引數 可傳可不傳 c 沒有引數 傳參會報錯,但是c 支援預設引數 注 預設引數一般放在函式的宣告位置,不可以在宣告和定義的地方同時出現預設值。2 函式過載 靜態多型 概念 在同一作用域內,含有幾個函式名相同,引數列表不同 引數的個數 型別 次序 與返回值無關的函式。3 明...

總結 寒假總結

本來說就是個10天的假期都閒的不得了呢。怎麼一下子就放了這麼久啊。大概反思一下情況吧。作息時間 大概是每天11點多一點就睡覺了,主要是我自己熬不了夜太困了 然後白天的精神還是不錯的。聽 dy 講題。收穫也不小,思路開闊了一些,而且見識到一些牛逼的思維題。然後回放看的也蠻認真的,大概屬於之前會的不用看...