Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JPAQuery和Querydsl中从连接的实体设置列_Java_Jpa_Querydsl - Fatal编程技术网

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()