JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Object Relational Mapping » Hibernate  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
作者 Hibernate HQL Left Join
wildpeanut

tinyurl.com/lsyoy



發文: 162
積分: 0
於 2010-08-09 11:58 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
各位好,

我有一個Hibernate HQL的問題,我想要使用left join這樣在一對多的情況下,
即使子Table沒有資料在使用 left join父Table時仍然能夠有值~~

如果是oracle大概就是這樣
1
select a.id, b.phone from uer a, phoneTable b where a.id = b.id(+) 


我使用HQL下了這樣的SQL
1
select a.id, a.phoneSet.phone from user a left join a.phoneSet


無法執行...
錯誤有時是 illegal attempt to dereference collection
有時是其他的...

我參考了良葛格的一對多設定
http://caterpillar.onlyfun.net/Gossip/HibernateGossip/OneToMany.html

也參考了Hibernate HQL的使用手冊
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

可是都試不出來 @@ 請各位前輩指教一下,謝謝!


reply to postreply to post
作者 Re:Hibernate HQL Left Join [Re:wildpeanut]
qrtt1





發文: 1756
積分: 32
於 2010-08-09 13:08 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
wildpeanut wrote:

我使用HQL下了這樣的SQL
1
select a.id, a.phoneSet.phone from user a left join a.phoneSet




試試這個唄
1
SELECT a.id, ps.phone from user a left join a.phoneSet ps


reply to postreply to post
蝸牛角上爭何事?石火光中寄此身,隨富隨貧且歡樂,不開口笑是癡人。
my notes
作者 Re:Hibernate HQL Left Join [Re:qrtt1]
wildpeanut

tinyurl.com/lsyoy



發文: 162
積分: 0
於 2010-08-09 13:18 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝你的回覆

我嘗試了一下你的方法,結果出現
org.hibernate.exception.SQLGrammarException: could not execute query

請問是我漏掉什麼嗎? /_\

我說明一下我的環境
我使用Eclipse 3.5, Hibernate 3.3.1 jdk 1.6


reply to postreply to post
作者 Re:Hibernate HQL Left Join [Re:wildpeanut]
qrtt1





發文: 1756
積分: 32
於 2010-08-09 13:59 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
wildpeanut wrote:
謝謝你的回覆

我嘗試了一下你的方法,結果出現
org.hibernate.exception.SQLGrammarException: could not execute query

請問是我漏掉什麼嗎? /_\

我說明一下我的環境
我使用Eclipse 3.5, Hibernate 3.3.1 jdk 1.6


我有用我的專案試過,我用的是訂單(Order)與訂單明細(OrderEntry)去試的
在 Order 中,定義與 OrderEntry 一對多的關係
1
2
  @OneToMany(cascade = { CascadeType.ALL })
  private List<OrderEntry> entries = new ArrayList<OrderEntry>();


試起來是可以 left join 的。您是否有定義這一層關係呢?
如果沒有這一層次的宣告,那你只能用 SQL Query 了
1
session.createSQLQuery("...")


qrtt1 edited on 2010-08-09 14:01
reply to postreply to post
蝸牛角上爭何事?石火光中寄此身,隨富隨貧且歡樂,不開口笑是癡人。
my notes
作者 Re:Hibernate HQL Left Join [Re:qrtt1]
wildpeanut

tinyurl.com/lsyoy



發文: 162
積分: 0
於 2010-08-09 23:29 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
你好,

感謝你的回覆, 我原本的方法並沒有使用annotation, 後來改用annotation時無法直接使用JBoos提供的Hibernate Eclipse plugin 裡面的HQL Editor查詢...
Eclipse會報 An AnnotationConfiguration instance is required to use, 我猜可能要設類似<annotationconfiguration configurationfile="${class.dir}/hibernate.cfg.xml"/>的東西, 可是不知要加在哪 @@

拉拉紮紮說了一堆, 最主要還是要感謝你提供另一個方法 session.createSQLQuery("...")
我晚點試試看 /(_ _)\

另外想請教一點, 如果說Hibernate是為了讓我不用將永久層綁死在某個特定的DB上, 那使用原生的SQL查詢是不是不會是一個最終的解決方法?


reply to postreply to post
作者 Re:Hibernate HQL Left Join [Re:wildpeanut]
qrtt1





發文: 1756
積分: 32
於 2010-08-09 23:56 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
wildpeanut wrote:
你好,

感謝你的回覆, 我原本的方法並沒有使用annotation, 後來改用annotation時無法直接使用JBoos提供的Hibernate Eclipse plugin 裡面的HQL Editor查詢...
Eclipse會報 An AnnotationConfiguration instance is required to use, 我猜可能要設類似<annotationconfiguration configurationfile="${class.dir}/hibernate.cfg.xml"/>的東西, 可是不知要加在哪 @@

拉拉紮紮說了一堆, 最主要還是要感謝你提供另一個方法 session.createSQLQuery("...")
我晚點試試看 /(_ _)\

另外想請教一點, 如果說Hibernate是為了讓我不用將永久層綁死在某個特定的DB上, 那使用原生的SQL查詢是不是不會是一個最終的解決方法?


你不需要特別轉成 Annotation 在沒原先的做法一定能用 <many-to-many> 做出 1-to-* 的效果。

AnnotationConfiguration 是用在讀 Configuration 時為了讀那些含有 Annotation 的類別用的。
是用在 HibernateUtil 裡的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
 
public class HibernateUtil {
 
  private static final SessionFactory sessionFactory = buildSessionFactory();
 
  private static SessionFactory buildSessionFactory() {
    try {
      // Create the SessionFactory from hibernate.cfg.xml
      return new AnnotationConfiguration().configure()
          .buildSessionFactory();
    } catch (Throwable ex) {
      // Make sure you log the exception, as it might be swallowed
      System.err.println("Initial SessionFactory creation failed." + ex);
      throw new ExceptionInInitializerError(ex);
    }
  }
 
  public static SessionFactory getSessionFactory() {
    return sessionFactory;
  }
}


Hibernate 是否真能讓你保持資料庫的可移植性,那要看你資料庫間的 SQL 實作有多大的差異。
這差異可能比你想像來得多,SQL 包含的不只是語法、還有資料型別的差異。

光是處理聚合函式就會想要光依賴 Hibernate 來維持可移植性了。
因為語法的實作的嚴謹度不同,
會透成最後組成 SQL 的語法有很大的不同,間接影響你 HQL 的寫法。

我自己覺得 Hibernate 能處理的可移植性,是資料型態上的支援。
因為他有 Dialect 的設計,你可以不用理會資料庫到底有沒有布林型別。
像 Oracle 就沒有布林要用整數來取代,有的資料庫是有布林就直接定義成布林欄位。

另外,針對不同資料庫的最佳化,也有必要直接改成 natvie SQL,也可能直接使用資料庫內建的特異功能。
這就只能將你的 SQL 獨立至設定檔案,依情況透過 build tool (ex. ANT) 幫你選擇要用那一個資料庫的設計了。
Hibernate 設計的初衷是要讓熟悉 OOP 的程式設計師以 OO 的方式與資料庫互動,
至於是不是可以移植並不是最大的考量。

也許能這麼想:Java 即使是攜性好的,但為了效能必需以 JNI 輔助時產生的 trade off


reply to postreply to post
蝸牛角上爭何事?石火光中寄此身,隨富隨貧且歡樂,不開口笑是癡人。
my notes
作者 Re:Hibernate HQL Left Join [Re:qrtt1]
wildpeanut

tinyurl.com/lsyoy



發文: 162
積分: 0
於 2010-08-29 19:26 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝qrtt1詳細的回覆
我後來找了Hibernate in Action來看,我要做的功能在裡面叫Projection
裡面的例子是Item和Bid的例子,我把兩者的關聯設成一對多再利用以下的程式碼就產生類似報表的功能了,之前可能某的部分沒有設定正確 0rz

1
2
3
4
5
6
7
8
Session session = HibernateUtil.getSessionFactory().openSession();
Iterator i = session.createQuery(
        "select item.id, item.itemName, bid.bidAmount " +
        "from Item item left join item.bids bid " +
        "where bid.bidAmount > 100"
        ).list().iterator();
session.close();
HibernateUtil.getSessionFactory().close();


我漸漸覺得Hibernate是個好物了Big Smile
附上我設定的xml給其他人參考
ITEM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<hibernate-mapping>
    <class name="hibernate.orm.Item" table="ITEM">
        <id name="itemId" type="string">
            <column name="ITEM_ID" />
        </id>
        <property name="itemName" type="string">
            <column name="ITEM_NAME" />
        </property>
        <property name="createTime" type="timestamp">
            <column name="CREATE_TIME" />
        </property>
        <set name="bids" table="BID" cascade="save-update">
          <key column="ITEM_ID"/>
          <one-to-many class="hibernate.orm.Bid"/>
        </set>
    </class>
</hibernate-mapping>

BID
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<hibernate-mapping>
    <class name="hibernate.orm.Bid" table="BID">
        <id name="bidId" type="string">
            <column name="BID_ID" />
        </id>
        <property name="itemId" type="string">
            <column name="ITEM_ID" />
        </property>
        <property name="bidAmount" type="long">
            <column name="BID_AMOUNT" />
        </property>
        <property name="userId" type="string">
            <column name="USER_ID" />
        </property>
    </class>
</hibernate-mapping>


reply to postreply to post
» JWorld@TW »  Object Relational Mapping » Hibernate

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8