2014-10-01 1 views
0

У меня есть отображение спящего режима, который выглядит следующим образом:Hibernate - Запрос несколько таблиц с одним спящих-отображением

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping package="org.lwl.anlei.bl.model.imp"> 

    <class name="PersonFo"> 
    <id name="id" type="integer"/>  
    <property name="name" type="string"/> 
    <property name="info" type="string"/> 
    </class> 

    <sql-query name="person1"> 
    <return alias="gb" class="PersonFo"/> 
    SELECT id   as {gb.id}, 
      name  as {gb.name}, 
      info  as {gb.info} 
    FROM table 
    WHERE field1 = :param 
    </sql-query> 

    <sql-query name="person2"> 
    <return alias="gb" class="PersonFo"/> 
    SELECT id   as {gb.id}, 
      second_name as {gb.name}, 
      whatever as {gb.info} 
    FROM table 
    WHERE field2 = :param 
    </sql-query> 

</hibernate-mapping> 

Это simplyfied НВМ, что у меня есть. В Java я получаю мои данные таким образом, с «getQueryName»:

List<Person> myPersons = 
    session.getNamedQuery("person1").setString("param", "important text").list(); 

Теперь я должен использовать представление, вместо этих querys. Я знаю, я мог бы просто написать «SELECT ххх FROM view_person1» и «SELECT ххх FROM view_person2» в SQL-querys, но я предпочел бы использовать что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping package="org.lwl.anlei.bl.model.imp"> 

    <class name="PersonFo" 
    table="view_person1" 
    entity-name="view_person1" > 
    <id name="id" column="id" type="integer"/>  
    <property name="name" column="name" type="string"/> 
    <property name="info" column="info" type="string"/> 
    </class> 

    <class name="PersonFo" 
    table="view_person2" 
    entity-name="view_person2" > 
    <id name="id" column="id" type="integer"/>  
    <property name="name" column="name" type="string"/> 
    <property name="info" column="info" type="string"/> 
    </class> 

</hibernate-mapping> 

В другом примере, я видел, как таким образом сохранить данные с помощью спящего режима. Map Two Identical tables (same schema...) to same entity in Hibernate

Они просто использовали:

Но, как я запрашиваю данные? Есть что-то вроде:

List<Person> myPersons = 
    session.getNamedEntity("view_person2").list(); 

Справка будет очень полезна! Спасибо!

ответ

1

Используйте polymorphism="explicit" дифференцировать свои именованные объекты:

<class name="PersonFo" 
    table="view_person1" 
    entity-name="view_person1" polymorphism="explicit" > 
    <id name="id" column="id" type="integer"/>  
    <property name="name" column="name" type="string"/> 
    <property name="info" column="info" type="string"/> 
    </class> 

    <class name="PersonFo" 
    table="view_person2" 
    entity-name="view_person2" > 
    <id name="id" column="id" type="integer"/>  
    <property name="name" column="name" type="string"/> 
    <property name="info" column="info" type="string"/> 
    </class> 

и запросить ваши именованные объекты, как показано ниже:

List list1 = session.createQuery("from view_person1").list(); 
List list2 = session.createQuery("from view_person2").list(); 
+0

Я буду проверять. Заранее спасибо! – Stix