一些Hibernate的用法筆記(2)

這篇博客來自我自己的博客,歡迎多點上來wishselfly's blog

在一些實際的開發(fā)環(huán)境中谆膳,我們查詢一張表叭爱,可能需要關聯(lián)到另外一張表的信息,不是那種已經存在于數(shù)據(jù)庫表的字段中的數(shù)據(jù)漱病,可能是需要統(tǒng)計的一些數(shù)據(jù)买雾,例如我需要知道這個用戶在系統(tǒng)下面到底有多少中角色,寫成SQL可能是

select {ac.*},
       (select count(*) from account_role_rel where account_role_rel.account_id=ac.id) role_count
       from account ac 
       where
       ac.id=?

對于像上述查詢語句中杨帽,這種查出來為純數(shù)字的變量漓穿,而且不存在于實體當中的變量,我們可以通過addScalar的方式捕獲出來

那么我們在DAO中轉換當前SQL語句查詢結果的代碼如下:

SQLQuery q = session.createSQLQuery(
    "select {ac.*}," +
       "(select count(*) from account_role_rel where account_role_rel.account_id=ac.id) role_count " +
       "from account ac " +
       "where" +
       "ac.id=1"
);
q.addEntity("ac", AccountModel.class);
//可以通過StandardBasicTypes設置額外捕獲的參數(shù)的類型
q.addScalar("role_count", StandardBasicTypes.INTEGER);
 
//獲取到的內容為Object[]{AccountModel, role_count}
return q.uniqueResult();

StandardBasicTypes里面有很多基本類型:


還記得我們之前聲明的用戶和角色的關聯(lián)表:



現(xiàn)在我們需要聲明AccountRoleRelModel.java注盈,我需要在里面Join上RoleModel和AccountModel的實體:

/**
* 用戶與角色的關聯(lián)表的實體
*/
@Entity
@Table(name = "account_role_rel")
public class AccountRoleRelModel {
    private Integer id;
    private AccountModel account;
    private RoleModel role;
 
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        returnn this.id;
    }
 
    @OneToOne    //這里可以改成ManyToOne晃危,相對,下面的JoinColumn需要加上insertable=false, updatable=false
    @JoinColumn(name = "account_id", referencedColumnName = "id")
    public AccountModel getAccount() {
        return this.account;
    }
 
    @OneToOne
    @JoinColumn(name = "account_id", referencedColumnName = "id")
    public RoleModel getRole() {
        return this.role;
    }
 
    //setter省略
}

這種時候老客,我們在編寫DAO的時候僚饭,我們可以通過addJoin加入對應實體的映射:

@Repository()
public class AccountRoleRelDAO {
 
    @PersistenceContext
    public EntityManager em;
 
    @Transactional(readOnly = true)
    public List<Object[]> getCashAccount(int accountId) {
        Session session = em.unwrap(Session.class);
        SQLQuery q = session.createSQLQuery(
                "select {account_role_rel.*}," +
                        "{account.*}," +
                        "{role.*} " +
                        "from account_role_rel " +
                        "inner join role on "  +
                        "role.id=account_role_rel.role_id " +
                        "inner join account on " +
                        "account.id=account_role_rel.account_id " +
                        "where account_role_rel.account_id=:accountId"
        );
        q.setParameter("accountId", accountId);
        q.addEntity("account_role_rel", AccountRoleRelModel.class);
 
        /* public abstract SQLQuery addJoin(String tableAlias, String path)
         * Declare a join fetch result.
         * Parameters:
         * tableAlias - The SQL table alias for the data to be mapped to this fetch
         * path - The association path ([owner-alias].[property-name]).
         */
        //根據(jù)上述定義,addJoin的第一個參數(shù)胧砰,應該是需要join的表在SQL語句中的名字鳍鸵,如果我們給對應表聲明了別名的話,這里填的應該是別名
        //后面應該是主表在SQL中的名字尉间,有別名用別名权纤,然后.后面接實體中,Join的模型的變量的名字
        //例如AccountRelModel中我們聲明AccountModel Join的變量名為account
        //因此這里填的是account_role_rel.account
        q.addJoin("account", "account_role_rel.account");
        //同上
        q.addJoin("role", "account_role_rel.role");
        //返回的內容List<Object[AccountRelModel, AccountModel, RoleModel]>乌妒,順序根據(jù)上面addEntity汹想、addJoin的順序產生對應的Object[]內用的順序
        return (List<Object[]>) q.list();
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市撤蚊,隨后出現(xiàn)的幾起案子古掏,更是在濱河造成了極大的恐慌,老刑警劉巖侦啸,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件槽唾,死亡現(xiàn)場離奇詭異,居然都是意外死亡光涂,警方通過查閱死者的電腦和手機庞萍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忘闻,“玉大人钝计,你說我怎么就攤上這事。” “怎么了私恬?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵债沮,是天一觀的道長。 經常有香客問我本鸣,道長疫衩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任荣德,我火速辦了婚禮闷煤,結果婚禮上,老公的妹妹穿的比我還像新娘涮瞻。我一直安慰自己鲤拿,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布饲宛。 她就那樣靜靜地躺著,像睡著了一般嗜价。 火紅的嫁衣襯著肌膚如雪艇抠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天久锥,我揣著相機與錄音家淤,去河邊找鬼。 笑死瑟由,一個胖子當著我的面吹牛絮重,可吹牛的內容都是我干的。 我是一名探鬼主播歹苦,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼青伤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了殴瘦?” 一聲冷哼從身側響起狠角,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚪腋,沒想到半個月后丰歌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡屉凯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年立帖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悠砚。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡晓勇,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情宵蕉,我是刑警寧澤酝静,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站羡玛,受9級特大地震影響别智,放射性物質發(fā)生泄漏。R本人自食惡果不足惜稼稿,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一薄榛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧让歼,春花似錦敞恋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至改执,卻和暖如春啸蜜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辈挂。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工衬横, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人终蒂。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓蜂林,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拇泣。 傳聞我的和親對象是個殘疾皇子噪叙,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內容