【发布时间】:2022-06-16 15:09:22
【问题描述】:
我正在尝试使用 querydsl 构建一个连接两个表的查询。但是,相应的 Java 类数据类型之间的细微差异似乎使我无法直接比较查询中的两列值。 A表对应的对象内的数据类型为java.util.UUID,B表对应的对象的数据类型为String。
我有类似以下的内容:
@Table(name = "TABLE_A")
public class TableA {
@Column(name = "uuid")
@Type(type = "uuid-char")
private UUID uuid;
}
@Table(name = "TABLE_B")
public class TableB {
@Column(name = "uuid")
private String uuid;
}
@Service
public class QueryService {
private final JPQLQueryFactory queryFactory;
public UUID getData(UUID input) {
return queryFactory.select(QTableA.tableA.uuid)
.from(QTableA.tableA)
.innerJoin(QTableB.tableB)
.on(QTableB.tableB.uuid.eq(QTableA.tableA.uuid.toString()))
.where(QTableA.tableA.uuid.eq(input))
.fetchOne();
}
}
上面的代码没有返回任何东西。但是,下面的代码似乎可以工作:
@Service
public class QueryService {
private final JPQLQueryFactory queryFactory;
public UUID getData(UUID input) {
return queryFactory.select(QTableA.tableA.uuid)
.from(QTableA.tableA)
.innerJoin(QTableB.tableB)
.on(QTableA.tableA.uuid.eq(input)
.and(QTableB.tableB.uuid.eq(input.toString()))
.where(QTableA.tableA.uuid.eq(input))
.fetchOne();
}
}
我不明白为什么直接比较列不起作用,但将它们与公共变量进行比较确实有效。 QTableA.tableA.uuid.toString() 会不会调用正确的toString() 方法?
【问题讨论】:
-
看起来 JPA 对类型比较非常严格。如果我更改字段以使它们在表定义中具有相同类型,则比较有效。我想知道是否有一种方法可以强制代码将对象视为来自同一个类,也许以某种方式使用类转换。