请考虑以下示例:

我想使用JPA/Hibernate查询左边的对象,同时直接加入标签。然而,要使用的标签列是由动态会话参数决定的。对一些用户来说,它是“英语”,而对另一些用户来说,则是“德语”。因此,我的join需要针对仅在运行时在动态变量范围中定义的列。
我看到以下(理论上)解决办法:
虽然解决方案1是可行的,但它效率低下,涉及大量样板代码。另一方面,我无法给出2-4的实际解决方案。
此外,考虑到标签必须由数据库管理--这种用例的最佳实践解决方案是什么?
发布于 2019-08-06 13:53:03
如果有一个带有languageCode类型的参数,我假设这个问题可以用CASE子句来解决,类似于这样:
SELECT t0.id, t0.location, CASE WHEN (?1 = 1) THEN t1.english ELSE t1.german END AS label
FROM Location t0 INNER JOIN Translation t1 ON (t0.label_id = t1.id)并且可以使用FluentJPA构建查询。
public List<TranslatedLocation> getTranslatedLocations(int langCode) {
FluentQuery query = FluentJPA.SQL((Location l,
Translation t) -> {
String trans = CASE(WHEN(langCode == 1).THEN(t.getEnglish())
.ELSE(t.getGerman())).END();
String label = alias(trans, TranslatedLocation::getLabel);
SELECT(l.getId(), l.getLocation(), label);
FROM(l).JOIN(t).ON(l.getTranslation() == t);
});
return query.createQuery(em, TranslatedLocation.class).getResultList();
}结果SQL:
SELECT t0.id, t0.location,
CASE WHEN (?1 = 1) THEN t1.english ELSE t1.german END AS label
FROM Location t0 INNER JOIN Translation t1 ON (t0.label_id = t1.id)实体申报:
@Entity
@Data //lombok
public static class Location {
@Id
private int id;
private String location;
@ManyToOne
@JoinColumn(name = "label_id")
private Translation translation;
}
@Entity
@Data //lombok
public static class Translation {
@Id
private int id;
private String english;
private String german;
}
@Tuple
@Getter //lombok
public static class TranslatedLocation {
@Id
private int id;
private String location;
private String label;
}https://stackoverflow.com/questions/57361456
复制相似问题