2017-03-19 34 views
7

Eski koda, yeni koda eşlemeye çalıştığım eski kodum var.Karmaşık bağlantılar için hazırda bekletme

OLD_PERSON 
pid 
sid 
name 
age 

NEW_PERSON 
pid 
sid 
fid 
age 

RESOLVE_PERSON 
pid 
fid 
status 

eski dünyada

domain.Person { 
ID _id; 
String _name; 
Integer _age; 
} 

Java sınıfı, sadece bir masa vardı: OLD_TABLE. Hazırda bekletme eşlemesi basit, yalnızca bir sınıf ve sütunlarıydı. Yeni dünyada, yukarıdaki 3 tabloyu kullanmalı ve adın OLD_PERSON'dan geldiği ve NEW_PERSON'dan itibaren bir varlık üretmem gerekir. Yani temelde bir SQL sorgusu: Araştırma sırasında

select op.name as name, np.age as age 
from OLD_PERSON op 
INNER JOIN RESOLVE_PERSON rp 
on rp.pid = op.pid 
INNER JOIN NEW_PERSON np 
on np.pid = rp.pid and np.fid = rp.fid and np.sid = op.sid 
where rp.status = 'CURRENT' 

/ı hazırda xml "tablosunu JOIN" nin eşdeğerdir "İkincil tabloları" kullanabileceklerini keşfettiler Googling. Not: Bu kod eski ve hala hibernate3.5.6 olduğum için ek açıklama kullanamıyorum.

Yani benim eşleme dosyasının içinde katılmak tablo ekledi:

<class name="domain.Person" table="OLD_PERSON"> 
     <composite-id name="_id" class="Id"> 
      <key-property access="property" name="key1" type="long" column="pid" /> 
      <key-property access="property" name="key2" type="int" column="sid" /> 

      <generator class="assigned" /> 
     </composite-id> 

     <property name="_Name" type="String" column="name" /> 

     <join table="NEW_PERSON" fetch="join" inverse="false"> 
      <key> 
      <column name="pid" /> 
      <column name="sid" /> 
      </key> 
      <property name="_age" column="age" not-null="true" /> 
     </join> 
</class> 

Ama NEW_PERSON tablo bir iç RESOLVE_PERSON tablo ile katılmak gerektirir katılmak. subselect kullanmayı denedim, ancak kullanılacak doğru şey değil. Burada herhangi bir yerde formülü'u arayamıyorum.

Bunun nasıl elde edilebileceğine dair herhangi bir işaretçi var mı? Esasen sorduğum, JOIN üzerinde bir ölçüt/kısıtlama kontrolünün nasıl uygulanacağıdır.

cevap

1

Sorununuzla benzer bir durum yaşadım. Üçüncü tabloyu bir varlığa eşledim ve bu varlık için mülkünden bir şeyler almak için DAO'yu kullandım. İşte

,

DAO oldukça normaldir (ı ek açıklama kullandık, bu nedenle bu doğrudan kullanabilirsiniz, ama umarım bu size biraz ilham verecek bir şey olmadığı için), kodu

@Entity 
@Table(name = "resolve_person") 
public class ResolvePerson implements java.io.Serializable { 
    private OldPerson old; 
    private NewPerson new; 

    ... 

    @ManyToOne // you may change it to other relationships 
    @JoinColumn(name = "pid", nullable = false) 
    public OldPerson getOldPerson() { 
     return this.old; 
    } 

    public void setOldPerson (OldPerson old) { 
     this.old = old; 
    } 

    @Id 
    @GeneratedValue(generator = "idGenerator") 
    @GenericGenerator(name = "idGenerator", strategy = "foreign", 
      parameters = { @org.hibernate.annotations.Parameter(name = "property", value = "fid") }) 
    @Column(name = "fid", nullable = false, unique = true) 
    public NewPerson getNewPerson() { 
     return this.New; 
    } 

    public void setNewPerson (NewPerson new) { 
     this.new = new; 
    } 
} 

public List findByProperty(String propertyName, Object value) { 
     log.debug("finding ResolvePerson instance with property: " 
       + propertyName + ", value: " + value); 
     try { 
      String queryString = "from ResolvePerson as model where model." 
        + propertyName + "= ?"; 
      Query queryObject = getSession().createQuery(queryString); 
      queryObject.setParameter(0, value); 
      return queryObject.list(); 
     } catch (RuntimeException re) { 
      log.error("find by property name failed", re); 
      throw re; 
     } 
    } 

Artık "durum" özelliğinin "geçerli" olarak ayarlanmış özelliğini sorgulayabilirsiniz.

İlgili konular