2015-08-14 21 views
6

Spring & Hazırda bekletme özelliğini kullanarak webapp geliştiriyorum.Hazırda Bekletme - 1'e karşı 2 sütunu birleştirmenin bir yolu var mı?

Tablo 1: BaseTable

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| Id   | bigint(20) | NO | PRI |   | auto_increment | 
| Serial1 | varchar(255) | YES |  | NULL |    | 
| Serial2 | varchar(255) | YES |  | NULL |    | 
| ModelNum | varchar(255) | YES |  | NULL |    | 
| ...  | ....   | .. | 0 |   |    | 
+------------+--------------+------+-----+---------+----------------+ 

Tablo 2: DetailTable

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| Id1  | varchar(20) | NO | PRI |   |    | 
| Id2  | varchar(20) | NO | PRI |   |    | 
| Id3  | varchar(20) | NO | PRI |   |    | 
| Serial  | varchar(255) | YES |  | NULL |    | 
| ...  | ....   | .. | 0 |   |    | 
+------------+--------------+------+-----+---------+----------------+ 

I Serisi göre tablolar katılmak gerekir. Table2'daki Serial, Serial1 veya Serial2 veya Table1'dan gelen değerler içerebilir, bu nedenle OR operatörü gibi karşılaştırılmalıdır. Tablolar için hbm.xml kullanıyorum. Ek açıklama eşlemesi yok.

SELECT A.* FROM Table2 As a INNER JOIN Table1 As b 
ON (a.Serial = b.Serial1 or a.Serial = b.Serial2); 

Bu http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/associations.html geçti ama sadece 1 anahtar sütun kullanılıyor: Bunu daha önce Sorgu kullanıyordum

<one-to-one name="notes" 
    class="Notes" entity-name="Notes"> 
</one-to-one> 

: Ben gibi tablolar katıldım.

Bu senaryo için HBM.XML'yi kullanmaya nasıl katılırım? Mümkün mü?

+1

Örnek: T1.Serial1 A içerir, T1.Serial2 içerir B Table2, Serial A için bir, biri Seri B için iki satır vardır? Beklenen sonuçların nedir? Muhtemelen aynı tabloya iki kez katılır ve sonuçlarınızı taklit edebilirsiniz, ancak yanılmış olabilirim ... 'Tablodan * seçim T1 LEFT JOIN tablo2 T2A üzerinde T1A1. T1A.Ierial LEFT JOIN table2 T2B on T1.Serial = T2b.Serial' Bu, tablo 2'yi bir satır olarak tablo 1'de birleştirir. Bir OR kullanarak tablo1 ID başına birden fazla satır alırsınız ... belki de istediğiniz ... bu yüzden beklenen sonuçları görmeniz gerekir. – xQbert

+0

Her iki satırı da seçmeli. –

+0

@xQbert: Kullandığım Sorgu ekledim. İlkbahar/Hazırda Bekletme –

cevap

1

Çözüm 1

için doğal sorgu kullanmak gerekir. Görünen sorgunuzdaki yabancı anahtarı, yine de görünüm için kullanacağınız projeyi yansıtın. Ardından varlığınızı görünüme göre eşleyin.

Çözüm 2

Kullanım join formula:

Örneğin, Table1 eşleştirilmiş varlıktaki Table2 eşleştirilmiş varlıkla çok-bir ilişki define (Kullanım durumunuz gibi görünüyor) :

@ManyToOne 
@JoinColumnsOrFormulas({ 
     @JoinColumnOrFormula([email protected](value="(SELECT t2.serial FROM Table2 t2 WHERE serial1 = t2.serial OR serial2 = t2.serial)", referencedColumnName="serial")) 
    }) 
private Entity2 entity2; 

Ancak formüller şimdilik hazırda çok kırılgan görünmektedir katılmak (sadece birden çok t için bu işi yapmak için yönetilen o-bir ilişki ve ben Entity2Serializable uygulamak zorunda kaldım; aksi halde işe yaramadı ve bazı garip NullPointer- ve ClassCastException s) attı.

+0

Açıklamaları kullanmamam ve tüm eşleştirmeler xml'yi temel almasına rağmen, bu geçerli bir seçenek gibi görünüyor. Cevap için teşekkürler. –

1

Sen yabancı anahtar Table2 başvuran ortaya Table1 bir veritabanı görünüm oluşturma Bu amaçla

String sql = "SELECT A.* FROM Table2 As a INNER JOIN Table1 As b " 
      + " ON (a.Serial = b.Serial1 or a.Serial = b.Serial2);"; 
SQLQuery query = session.createSQLQuery(sql); 
query.addEntity(Table2.class); 
List<Table2> tableContent = query.list(); 
+0

Şu anda aynı kodu kullanıyorum.Sadece sorgu ile nesneleri değiştirmek istedim. Hbm.xml kullanarak 1 vs 2 sütun katılmanın bir yolu yok mu? –

İlgili konular