Не знаю, может ли это вам помочь, я только что копался в Hibernate Исходный код.
Ваше исключение происходит внутри BinaryLogicOperatorNode.java в следующем месте:
if ( lhsColumnSpan != rhsType.getColumnSpan( sessionFactory ) ) {
throw new TypeMismatchException(
"left and right hand sides of a binary logic operator were incompatibile [" +
lhsType.getName() + " : "+ rhsType.getName() + "]"
);
когда rhsType и lhsType являются объектами org.hibernate.Type:
Type lhsType = extractDataType( lhs );
Type rhsType = extractDataType( rhs );
Теперь давайте посмотрим, что делает getColumnSpan()
:
Согласно документам Hibernate:
public int getColumnSpan(Mapping mapping) throws MappingException
How many columns are used to persist this type.
Таким образом, в соответствии с этой логикой вы можете выполнять запросы такого типа только для объектов одинакового размера:
, если ваш Set<Book>
p.book
имеет столько же объектов, сколько возвращает select b from Book b
, этот запрос будет выполненуспешно, иначе это не получится.
Надеюсь, это поможет.