ผมเอา 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() ได้ด้วย ไม่ต้องมาจัดการเอง (แต่ไม่รู้มันทำงานช้าหรือเปล่า)


เมนูของ vsatayamas





เมื่อ พฤ. 26 ก.ค. 2550 @ 01:07
330642 [ลบ]
ขอบคุณสำหรับ ทริคดีๆ ครับ
อาจจะได้ใช้ในอนาคตอันใกล้นี้ ^^
เมื่อ พฤ. 26 ก.ค. 2550 @ 02:08
330651 [ลบ]