Итак, я нашел какой-то жуткий взлом с использованием sql инъекции, который решает мою проблему, но может быть склонен к ошибкам в некоторых условиях.
Если объединение было только на primary_language
, код был бы таким:
@OneToOne
@JoinColumns({@JoinColumn(name = "id", referencedColumnName = "customer_id"),
@JoinColumn(name = "primary_language_code", referencedColumnName = "language_code"),
@JoinColumn(name = "address_code", referencedColumnName = "address_code")})
private Address address;
@Column(name = "language_code", nullable = false)
private int languageCode;
Hibernate сгенерирует запрос, подобный следующему:
select customer0_.id as ...,
customer0_.primary_language_code as ...,
customer0_.secondary_language_code as ...,
customer0_.address_code as ...
Идея состоит в том, чтобы изменить значение имени для ввода sql код:
@OneToOne
@JoinColumns({@JoinColumn(name = "id", referencedColumnName = "customer_id"),
@JoinColumn(name = "id, case when customer.primary_language_code <= 2 " +
"then customer.primary_language_code " +
"else customer.secondary_language_code end",
referencedColumnName = "language_code"),
@JoinColumn(name = "address_code", referencedColumnName = "address_code")})
private Address address;
Сгенерированный sql запрос будет выглядеть следующим образом:
select customer0_.id as ...,
customer0_.primary_language_code as ...,
customer0_.secondary_language_code as ...,
customer0_.id, <--- sql injection here
case
when customer.primary_language_code <= 2 then customer.primary_language_code
else customer.secondary_language_code
end as ...,
customer0_.address_code as ...
Это будет работать, если у вас нет primary_language или Secondary_language в другой таблице, которую нужно объединить в таблице клиента.
I Я был бы рад найти лучшее решение этого вопроса, так как я не смею использовать его в производстве.