【问题标题】:QueryDsl - filtering Map based on keyQueryDsl - 基于键过滤地图
【发布时间】:2015-04-10 10:08:08
【问题描述】:

我的 hibenrate 实体类中有以下属性:

@MapKeyJoinColumn(name = "language_code")
@LazyCollection(LazyCollectionOption.EXTRA)
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "text_translations", joinColumns = @JoinColumn(name = "text_id"))
private Map<Language, String> translations = new HashMap<>();

现在我想查询这个实体并按用户的语言(即按地图的键)过滤地图的内容。我的查询中有以下联接:

StringPath titleTran = new StringPath("title_tran");
from(entity).
.leftJoin(entity.translations, titleTran).fetch().where(?mapKey?.eq(userLanguage));

我需要的是 ?mapKey? to by path to language of titleTran 路径。这在 QueryDsl 中是否可能?

【问题讨论】:

    标签: java sql hibernate dictionary querydsl


    【解决方案1】:

    在 Querydsl JPA 中,以下工作

    query.from(me).where(me.translations.containsKey(lang)).list(me);
    

    【讨论】:

    • 这只会过滤掉所有没有特定翻译的实体。我想获取实体和特定的翻译。实际上,如果找不到特定的,我想要后备翻译,但这是我目前通过子查询解决的另一个问题,它与 containsKey 做同样的事情(可能不是很有效)。
    【解决方案2】:

    如果要搜索给定的 Map 键,可以使用以下 HQL 查询:

    select me
    from MyEntity me
    join me.translations tr
    where
        index(tr) = :lang
    

    或使用 JPQL:

    select me
    from MyEntity me
    join me.translations tr
    where
        key(tr) = :lang
    

    【讨论】:

    • 谢谢。这就是解决方案。实际上,我还发现了一个似乎是为地图制作的 KEY 指令。无论如何,这些指令没有在 QueryDsl 中实现(或者我无法在 doc 中找到它们?)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2012-06-22
    • 2019-10-08
    相关资源
    最近更新 更多