<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    細心!用心!耐心!

    吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學業,五六點粗墨,七八筆買賣,九十道人情。

    BlogJava 聯系 聚合 管理
      1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
    JPA本地查詢(Native Query)(二)
    2010-01-20 10:49

    OK,現在對同一個查詢,再把結果集全部映射進實體對象。

     

    首先

    @NamedNativeQueries

    (

        {

           @NamedNativeQuery(

               name="ReturnOrderListWithFullEntityType",

                  query="select o.id as order_id,o.create_date as order_creation_date,o.description as order_description,o.sum_price as order_sum_total,

    c.name as customer_name,c.ctype as customer_type,c.id as customer_id from orders o join customer c on o.cust_id=c.id where o.cust_id=?1",

               resultSetMapping="ReturnOrderListWithFullEntityType"),

            。。。。。。。。。。。。。可能還有更多的本地查詢設置

    }

    )

    改變本地查詢的resultSetMapping

     

        @SqlResultSetMapping

        (

           name="ReturnOrderListWithFullEntityType",

           entities=

           {

               @EntityResult

               (

                  entityClass=entity.Order.class,

                  fields=

                  {

        @FieldResult(name="id",column="order_id"),

                             @FieldResult(name="date",column="order_creation_date"),

                      @FieldResult(name="desc",column="order_description"),

        @FieldResult(name="sum",column="order_sum_total")

                  }

               ),

     

               @EntityResult

               (

                  entityClass=entity.Customer.class,

                  discriminatorColumn="customer_type",

                  fields=

                  {

                      @FieldResult(name="id",column="customer_id"),

                      @FieldResult(name="name",column="customer_name")

                  }

               )

           },

           columns={}

        )

     

    entities屬性是一個包含與返回結果集相映射的所有實體的一個數組。這條查詢得到了訂單和用戶的信息,所以,與結果集映射的實體,就應該是OrderCustomer

    每一個映射實體用@EntityResult表示,entityClass表示實體類,fields表示該實體類中的屬性,與查詢結果中的哪些個列相映射。而每一個“屬性<->列”的映射關系,又保存在@FieldResult里面。name是實體屬性,column是查詢列(或列別名)

     

    要注意的是,如果要將結果集映射到實體對象,則

    1Select 語句中必須包含實體所映射的表中的PK,也就是 select o.id as order_id

     

    2. 反過來,“屬性<->列”的映射,也必須將表的PK映射到實體類的用@Id annotation批注的字段或屬性上。

     

    否則,JPA就會拋出一個exception

    oracle.toplink.essentials.exceptions.QueryException

    Exception Description: The primary key read from the row [DatabaseRecord(

        orders.ID => null

        orders.CREATE_DATE => 2009-05-27 00:00:00.0

        orders.SUM_PRICE => 36817.0

        orders.DESCRIPTION => This is an order creation example.

        orders.cust_id => null)] during the execution of the query was detected to be null. Primary keys must not contain null.

     

     

     

     

     

    再看一下關于Customer實體的映射,與Order不一樣的地方,是discriminatorColumn="customer_type" (可能為列別名)

    加上這個屬性的原因是,Customer類是一個父類,以供其他子類繼承,而J PA的內在多態性機制將會獲取到Customer的實際類型。根據J PA @Inheritance批注,得知,父類實體的表中必須有一個字段(默認為DTYPE)來表示各個子類的類型。所以當要將查詢結果集保存為實體的時候,它必須要知道你所保存的這個Customer實體到底是哪種類型。

    所以,你還必須在select子句中取得這個Discrimator Type的字段。

    否則又會拋出異常: 

    oracle.toplink.essentials.exceptions.QueryException

    Exception Description: Custom SQL failed to provide descriminator column : , as defined in SQLResultSetMapping : ReturnOrderListWithFullEntityType.

    或者:

    oracle.toplink.essentials.exceptions.QueryException

    Exception Description: Custom SQL failed to provide descriminator column : customer_type, as defined in SQLResultSetMapping : ReturnOrderListWithPartEntityPartScalarType.

     

     

    通過這種映射方式,我們可以推測,得到的結果集List中,數據會是這樣:

    [ {“Order對象1”, “Customer對象1”}, {“Order對象2”, “Customerr對象2”}, …… ]

     

    經過運行測試程序,得到了我們的推論

     

    *****ReturnOrderListWithFullEntityType*****

    entity.Order@48edb5 entity.GoldenCustomer@1ee2c2c  

    entity.Order@1402d5a entity.GoldenCustomer@1ee2c2c  

    entity.Order@1e13e07 entity.GoldenCustomer@1ee2c2c  

    entity.Order@9cfec1 entity.GoldenCustomer@1ee2c2c  

    entity.Order@747fa2 entity.GoldenCustomer@1ee2c2c  

    ……

    看來的確是保存了對象,而且注意第二個對象不是Customer而是GoldenCustomer,這說明,JPA自動將數據映射進了GoldenCustomer實體(盡管我們使用的是Customer實體進行保存 “entityClass=entity.Customer.class”


    posted on 2012-06-15 21:38 張金鵬 閱讀(7806) 評論(1)  編輯  收藏 所屬分類: JPA

    Feedback

    # re: JPA本地查詢(Native Query)(二)[未登錄] 2016-04-26 15:42 abc
    fdfdf  回復  更多評論
      

    主站蜘蛛池模板: 亚洲狠狠婷婷综合久久久久| 中文字幕亚洲无线码| 67pao强力打造67194在线午夜亚洲 | 丁香花免费高清视频完整版| 青青久在线视频免费观看| 国产一区二区三区免费在线观看| 亚洲人成网站999久久久综合| 女人18毛片a级毛片免费视频| 亚洲亚洲人成综合网络| 抽搐一进一出gif免费视频| 女人18毛片a级毛片免费| 亚洲色成人网站WWW永久四虎 | 亚洲免费视频网站| 亚洲国产综合专区电影在线| 免费大片黄在线观看| 亚洲区小说区图片区| 久久亚洲色WWW成人欧美| 亚洲AV无码乱码在线观看牲色| 亚洲av无码电影网| 无码国产精品一区二区免费式芒果 | 国产成人精品日本亚洲专| 久久99毛片免费观看不卡| 五月婷婷亚洲综合| 中文字幕成人免费高清在线视频| 久久精品国产亚洲沈樵| 亚洲黄色免费电影| jizzjizz亚洲日本少妇| 无码专区永久免费AV网站| 久久精品国产亚洲AV天海翼| 久久精品亚洲福利| 免费人人潮人人爽一区二区| 亚洲伊人色欲综合网| 99爱视频99爱在线观看免费| 亚洲欧洲免费无码| 在线观看国产区亚洲一区成人 | 春暖花开亚洲性无区一区二区 | 亚洲资源在线观看| 免费国产污网站在线观看15| 亚洲成年网站在线观看| 亚洲日韩中文在线精品第一| 亚洲视频在线免费看|