สมัครสมาชิก   เข้าระบบ  
ประกาศ: UKM 14 ที่ ม.มหาสารคาม เลื่อนเป็นวันที่ 9-10 ม.ค. 2552
การก่อสร้างซอฟต์แวร์
वीर
อ่าน: 242
ใช้ Hibernate แล้วก็ยังใช้ SQL อยู่ดี
ปกติแล้วใช้ Hibernate ใช้ HQL ด้วยก็จะดูเท่กว่ามานั่งใช้ SQL เหมือนเดิม เพราะไม่ต้องมานั่งบอกอีกว่า map ผลที่ query ได้ class ไหน แถมยัง portable กว่าด้วย (หรือเปล่า?)

ผมเอา Yaitron ( dictionary ที่แปลงมาจาก Lexitron ของ NECTEC อีกที) ใส่ database ไว้.

โดยทำเป็น 2 table แยก Entry กับ Synonym ไว้  อย่างเช่น reconcile ก็อาจจะเป็น synonym ของ accord. ข้อมูลที่เหลือก็อยู่ใน column xml หมดเลย เพราะว่าไม่อยากเขียนตัวแปลงมากเหนื่อย (เคยลองทำแล้วรู้สึกโปรแกรมซับซ้อนเกินไป).

ปกติเราจะ query คำจาก headword ก็ใช้ from Entry e where e.headword = :key ได้เลย

หรือถ้าจะ query จาก synonym ก็ใช้ inner join สบายๆ 

แต่พออยากไ้ดทั้ง 2 อย่าง วิธีที่ตรงไปตรงมาคือใช้ union แต่ว่าเหมือน HQL จะใช้ไม่ได้ เลยลองเล่นท่าไปใช้ left outer join แทนก็ช้ามาก  ถ้าเป็น MySQL เมื่อนานมาแล้ว ก็อาจจะสร้าง temporary table ขึ้นมาแล้ว insert จาก การ select 2 ครั้ง แต่ว่าใช้ HQL ทำอย่างไร?

แต่ด้วยความอ่านของผมใช้ union ดีกว่า มันจะได้เสร็จ :-P แต่ Hibernate ก็ดีนะ query ด้วย SQL เถื่อนๆ แล้วก็บอกว่าไปว่าอยากรับ class อะไรกลับมา มันก็ map มาให้เป็น object เรียบร้อยเลย :-)

public Entry[] getEntriesByHeadwordAndSynonym(String headword) {

  String query_string = "select entries.* from entries " +

"inner join synonyms on entries.id = synonyms.entry_id " +

"where key=:key " +

"union " +

"select entries.* from entries where headword = :key";

  List entries = getSession()

.createSQLQuery(query_string)

.addEntity(Entry.class)

.setParameter("key", headword)

.list();

  return (Entry[])

            entries.toArray(new Entry[entries.size()]);

}

 

 

ส่วนที่บอกว่าเป็น class อะไรก็คือ addEntity(Entry.class) พอเขียนแบบนี้ก็ได้ object ของ entry ออกมาเลย เรียก entry.getSynonyms() ได้ด้วย ไม่ต้องมาจัดการเอง (แต่ไม่รู้มันทำงานช้าหรือเปล่า)





หมวดหมู่: เรื่องทั่วไป
คำสำคัญ: hibernate  sql
สร้าง: พฤ. 12 ก.ค. 2550 @ 19:06   แก้ไข: พ. 08 ส.ค. 2550 @ 02:58   ขนาด: 6717 ไบต์
ความคิดเห็น
P
1. ^-FakE-^
เมื่อ พฤ. 26 ก.ค. 2550 @ 01:07
330642 [ลบ]

 

 ขอบคุณสำหรับ ทริคดีๆ ครับ

 

อาจจะได้ใช้ในอนาคตอันใกล้นี้ ^^ 

P
2. वीर
เมื่อ พฤ. 26 ก.ค. 2550 @ 02:08
330651 [ลบ]

ไม่รู้ดีจริงเปล่านะครับ lol
ชื่อ:
อีเมล:
IP แอดเดรส: 38.103.63.56
  เรียกใช้งานตัวจัดการข้อความ
ข้อความ:
 
รหัสสุ่ม: (ใส่รหัสสุ่มที่แสดงไว้ด้านบน)
  ยกเลิก
การพัฒนาซอฟต์แวร์