The implicit joining is always done via INNER JOIN.
If you want a LEFT JOIN, you need to:
1. Express the JOIN explicitly in your Criteria/JPQL query.
Code:
Root<B> b = cq.from(B.class);
Join<B,A> a = b.join("a", JoinType.LEFT);
2. Make sure to always check with: WHERE c IS NULL or c.id = :c.id as otherwise the SQL statement will be equivalent to an INNER JOIN anyway,
Also, if B and C don't have any join between them, they will end up in a Cartesian Product, so make sure your query is fetching data efficiently too.