Я полагаю, что e.department.name приведет к исключению, если e.department имеет значение null?
Нет.e.department.name
делает неявное внутреннее соединение между таблицами Employee и Departement.Поэтому, если у сотрудника нет какого-либо отдела, он даже не будет возвращен по запросу.
Если вы хотите, чтобы сотрудники без отдела выбирались, вам нужно left join:
select new com.java2s.common.EmployeeDetails(e.name, e.salary, d.name)
from Employee e
left join e.department d
Приведенный выше запрос вернет имя и зарплату сотрудника, а NULL - название отдела, если у сотрудника нет отдела.
Примечание: экспериментирование - это действительно хороший способ преобразования догадок в факты.Почему бы вам не попробовать этот запрос, а не угадать, что он будет делать?