如何将多个数据行映射到不同的字段



我正在尝试使用querydsl和投影将查询结果映射到对象上。

我有如下内容:

public record DataTransferObject(MyTable obj1, MyTable obj2) {
public static final ConstructorExpression<DataTransferObject> PROJECTION = 
Projections.constructor(obj1, obj2);
}
@Service
public class QueryService {
private final JPQLQueryFactory queryFactory;
public DataTransferObject getData(String id1, String id2) {
return queryFactory.select(DataTransferObject.PROJECTION)
.from(QMyTable.myTable)
.where(QMyTable.myTable.id.eq(id1)
.or(QMyTable.myTable.id.eq(id2))
.fetchOne();
}
}

但是当我遇到com.querydsl.core.NonUniqueResultException时,这不起作用。

像下面这样使用连接会导致obj1和obj2是同一个对象(即使两个id映射到两个唯一的行):

.leftJoin(QMyTable.myTable)
.on(QMyTable.myTable.id.eq(id1))
.leftJoin(QMyTable.myTable)
.on(QMyTable.myTable.id.eq(id2))

我想将String id1对应的DB行与DataTransferObject对象中的MyTable obj1字段相匹配。同样,我想将String id2对应的DB行与DataTransferObject对象中的MyTable obj2字段相匹配。

最好的方法是什么?

尝试将fetchOne()更改为fetchFirst()或fetchAll()

看起来我先发制人地定义了工作对象。它的工作方式是:

@Service
public class QueryService {
private static final QMyTable OBJ1 = new QMyTable("obj1");
private static final QMyTable OBJ2 = new QMyTable("obj2");
public static final ConstructorExpression<DataTransferObject> PROJECTION = Projections.constructor(
MyTable.projection(OBJ1),
MyTable.projection(OBJ2)
);
private final JPQLQueryFactory queryFactory;
public DataTransferObject getData(String id1, String id2) {
return queryFactory.select(PROJECTION)
.from(QMyTable.myTable)
.leftJoin(OBJ1)
.on(OBJ1.id.eq(id1))
.leftJoin(OBJ2)
.on(OBJ2.id.eq(id2))
.fetchOne();
}
}

略去了一些东西,但这是要点。

最新更新