I have three tables: “User”, “Employee” and “Worker”. “User” table has one-to-zero-or-one relationship with “Worker” and the same one-to-zero-or-one with “Employee”. User entity bean has following mapping attributes:
@OneToOne(cascade = CascadeType.ALL, mappedBy = "user")
private Worker worker;
@JoinColumn(name = "id_employee", referencedColumnName = "id")
@OneToOne
private Employee idEmployee;
My aim is to get all “User” records which have one of this attributes filled (not null). I try to use the query:
SELECT u FROM User u WHERE u.idEmployee IS NOT NULL OR u.worker IS NOT NULL
ORDER BY u.login
I suppose to get 15 records, but I get only 6. I divided this query into two separate:
SELECT u FROM User u WHERE u.idEmployee IS NOT NULL ORDER BY u.login;
SELECT u FROM User u WHERE u.worker IS NOT NULL ORDER BY u.login;
I get 9 and 6 records, respectively. Put together – required 15 records.

It looks like “OR” narrows the result set to only those records, which have worker field not null. Why does it work in such way? Thanks in advance.
The worker association is mapped by a foreign key in the worker table. This means that using
u.workermakes an inner join to the worker table, and theis not nullis always true. The resulting SQL should look like this:You need to use a left join to accept users having no worker: