Как получить оператор выбора в HQL, который будет возвращать все строки независимо от значений NULL - PullRequest
0 голосов
/ 20 января 2012

У меня есть объект, который содержит взаимно-однозначное сопоставление.

Customer.hbm.xml:

<class name="com.asi.shared.Customer" table="Customer">
    <id name="id" column="CustomerID">
         <generator class="assigned"/>
    </id>
    <property name="customerName" column="CustomerName" />
    ...
    <one-to-one name="corp" class="com.asi.shared.Corp"/>
 </class>

Corp.hbm.xml

<class name="com.asi.shared.Corp" table="Corp">
    <id name="id" column="CustomerID">
         <generator class="assigned"/>
    </id>
    <property name="customerName" column="CustomerName" />
    <property name="storeNumber" column="StoreNumber"/>
    <property name="corpCustomerId" column="CorpCustomerId"/>
</class>

Я хотел бы выполнить следующий запрос и получить все строки в таблице costumer.

    select customerName, id, support, corp.corpCustomerId
    from com.asi.shared.Customer ORDER BY customerName

Однако он возвращает только те строки, которые имеют что-то в таблице corp. Не каждый клиент будет иметь что-то в таблице corp, я не против иметь corp.corpCustomerId = null.

Что я делаю не так?

1 Ответ

1 голос
/ 20 января 2012

Когда вы выбираете customer.corp.corpCustomerId, вы неявно выполняете внутреннее соединение между обеими таблицами, тогда как вам нужно левое соединение. Перепишите ваш запрос как есть:

select customer.customerName, customer.id, corp.corpCustomerId
from Customer customer
left join customer.corp corp
order by customer.customerName

Примечание: ваш код будет более читабельным, если у вас не будет всех этих повторений в именах свойств. Не нужно называть собственность customerName. Это свойство класса Customer, поэтому достаточно customer.name. То же самое для corp.corpCustomerId, который будет легче читать как corp.customerId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...