Hello Brian Leierzapf, thank you for reporting the issue and providing a reproducer. Looking at you’re example I believe the problem is how you’re using the Criteria API. It’s true that you’re specifying JoinType.LEFT when calling the join method, but you’re ignoring the return value of that method - which is, the left joined association path - and later on calling e.g. from.get( Action_.location ).get( ... ). The JPA spec, in chapter 6.5.5, explicitly defines path navigation (i.e. the path.get() method) always has “inner join” semantics - that’s why in the resulting query you’re seeing inner joins. You should instead do something like:
final Join<Action, Location> locationJoin = from.join( "location", JoinType.LEFT );
...
predicates.add( cb.isTrue( locationJoin.get( "active" ) );
This probably used to work by chance in 5 since the get method reused the existing left join, but you should switch to using the correct path instances. |