首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java持久性:连接依赖于运行时参数的不同列

Java持久性:连接依赖于运行时参数的不同列
EN

Stack Overflow用户
提问于 2019-08-05 15:12:15
回答 1查看 292关注 0票数 0

请考虑以下示例:

我想使用JPA/Hibernate查询左边的对象,同时直接加入标签。然而,要使用的标签列是由动态会话参数决定的。对一些用户来说,它是“英语”,而对另一些用户来说,则是“德语”。因此,我的join需要针对仅在运行时在动态变量范围中定义的列。

我看到以下(理论上)解决办法:

  1. 之后不要对标签使用联接和查询。
  2. 让联接地址基于运行时参数的列。
  3. 使语言成为一个列,并使用一个组合键来加入标签(同时提供运行时参数作为复合键的第二部分)
  4. 使用视图创建两个不同的翻译表(一个用于德语,一个用于英语);使用运行时参数动态地与不同的表连接

虽然解决方案1是可行的,但它效率低下,涉及大量样板代码。另一方面,我无法给出2-4的实际解决方案。

此外,考虑到标签必须由数据库管理--这种用例的最佳实践解决方案是什么?

EN

回答 1

Stack Overflow用户

发布于 2019-08-06 13:53:03

如果有一个带有languageCode类型的参数,我假设这个问题可以用CASE子句来解决,类似于这样:

代码语言:javascript
复制
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构建查询。

代码语言:javascript
复制
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:

代码语言:javascript
复制
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)

实体申报:

代码语言:javascript
复制
@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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57361456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档