Java 如何在JPAQuery和Querydsl中从连接的实体设置列
我正在使用将现有软件国际化的过程中。作为其中的一部分,我有一个表,简化为最简单的情况,是:Java 如何在JPAQuery和Querydsl中从连接的实体设置列,java,jpa,querydsl,Java,Jpa,Querydsl,我正在使用将现有软件国际化的过程中。作为其中的一部分,我有一个表,简化为最简单的情况,是: ID AUTONUMERIC ID_OF_TEXT NUMBER TEXT VARCHAR 文本列必须翻译为新语言(可能存在也可能不存在)。因此,有另一个新的带有colunmns的表: ID_OF_TEXT NUMBER LANGUAGE_CODE VARCHAR TRANSLATED_TEXT VARCHAR 已存在表示基表的实体,无法更改此实体。生成的代码如下所示: class QMyBaseEn
ID AUTONUMERIC
ID_OF_TEXT NUMBER
TEXT VARCHAR
文本列必须翻译为新语言(可能存在也可能不存在)。因此,有另一个新的带有colunmns的表:
ID_OF_TEXT NUMBER
LANGUAGE_CODE VARCHAR
TRANSLATED_TEXT VARCHAR
已存在表示基表的实体,无法更改此实体。生成的代码如下所示:
class QMyBaseEntity extends EntityPathBase<MyBaseEntity> {
NumberPath<Long> id = createNumber("id", Long.class);
NumberPath<Long> toTranslateId = createNumber("toTranslateId", Long.class);
StringPath text = createString("text");
}
@Generated("com.mysema.query.codegen.EntitySerializer")
class QTranslationLookup extends EntityPathBase<TranslationLookup> {
NumberPath<Long> id = createNumber("id", Long.class);
NumberPath<Long> translationId = createNumber("translationId", Long.class);
StringPath languageCode = createString("languageCode");
StringPath translated_text = createString("translated_text");
}
在对现有代码进行尽可能少的更改的情况下,如何在结果
列表中设置翻译的值,以便返回的实体实例在文本
列中包含翻译,而不是旧(未翻译)表中的原始值?Mysema不是框架,QueryDSL是。QueryDSL过去是由Mysema开发的,但现在已经不是了,该软件包已经移动到com.QueryDSL
组id
不能覆盖实体投影中托管属性的值。这些值将始终是实体中的实际字段值。实体不能用作DTO。如果要投影不同类型的表达式,则需要使用元组投影
List<Tuple> results = query.from(qMyBaseEntity)
.leftJoin(qTranslationLookup)
.on(qTranslationLookup.translationId.eq(qMyBaseEntity.toTranslateId)
.and(qTranslationLookup.languageCode.eq(languageCode)))
.select(qMyBaseEntity, qTranslationLookup.translatedText.coalesce(qMyBaseEntity.text))
.fetch()
List results=query.from(qMyBaseEntity)
.leftJoin(qTranslationLookup)
.on(qTranslationLookup.translationId.eq(qMyBaseEntity.toTranslateId)
和(qTranslationLookup.languageCode.eq(languageCode)))
.select(qMyBaseEntity,qTranslationLookup.translatedText.coalesce(qMyBaseEntity.text))
.fetch()
或者,您可以例如返回映射:
Map<MyBaseEntity, String> results = query.from(qMyBaseEntity)
.leftJoin(qTranslationLookup)
.on(qTranslationLookup.translationId.eq(qMyBaseEntity.toTranslateId)
.and(qTranslationLookup.languageCode.eq(languageCode)))
.transform(GroupBy.groupBy(qMyBaseEntity).as(
qTranslationLookup.translatedText.coalesce(qMyBaseEntity.text))
.fetch()
Map results=query.from(qMyBaseEntity)
.leftJoin(qTranslationLookup)
.on(qTranslationLookup.translationId.eq(qMyBaseEntity.toTranslateId)
和(qTranslationLookup.languageCode.eq(languageCode)))
.transform(GroupBy.GroupBy(qMyBaseEntity).as(
qTranslationLookup.translatedText.coalesce(qMyBaseEntity.text))
.fetch()
或者可以使用QueryDSL的DTO投影:
List<ResultDTO> results = query.from(qMyBaseEntity)
.leftJoin(qTranslationLookup)
.on(qTranslationLookup.translationId.eq(qMyBaseEntity.toTranslateId)
.and(qTranslationLookup.languageCode.eq(languageCode)))
.select(Projections.constructor(ResultDTO.class, qMyBaseEntity, qTranslationLookup.translatedText.coalesce(qMyBaseEntity.text))
.fetch()
List results=query.from(qMyBaseEntity)
.leftJoin(qTranslationLookup)
.on(qTranslationLookup.translationId.eq(qMyBaseEntity.toTranslateId)
和(qTranslationLookup.languageCode.eq(languageCode)))
.select(Projections.constructor(ResultDTO.class、qMyBaseEntity、qTranslationLookup.translatedText.coalesce(qMyBaseEntity.text))
.fetch()
List<ResultDTO> results = query.from(qMyBaseEntity)
.leftJoin(qTranslationLookup)
.on(qTranslationLookup.translationId.eq(qMyBaseEntity.toTranslateId)
.and(qTranslationLookup.languageCode.eq(languageCode)))
.select(Projections.constructor(ResultDTO.class, qMyBaseEntity, qTranslationLookup.translatedText.coalesce(qMyBaseEntity.text))
.fetch()