【问题标题】:Unable to properly compare table columns with different types无法正确比较不同类型的表列
【发布时间】: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 对类型比较非常严格。如果我更改字段以使它们在表定义中具有相同类型,则比较有效。我想知道是否有一种方法可以强制代码将对象视为来自同一个类,也许以某种方式使用类转换。

标签: java querydsl


【解决方案1】:

请尝试:

.on(QTableB.tableB.uuid.toString().eq(QTableA.tableA.uuid.toString()))

QTableB.tableB.uuid上申请toString

【讨论】:

  • 一旦我在 QTableB.tableB.uuid 上调用 toString,我就不能再调用 .eq,因为 String 没有那个方法。也许我可以做类似 .on(QTableB.tableB.uuid.toString().equals(QTableA.tableA.uuid.toString())) 的事情。然后将其转换为我可以插入到查询中的表达式,但我无法让那里的语法正常工作
  • tableA.uuid 中删除toString 怎么样? .on(QTableB.tableB.uuid.eq(QTableA.tableA.uuid))
  • 我收到一个错误:无法解析方法 'eq(ComparablePath)'
【解决方案2】:

看起来无法与当前版本进行直接比较。 Querydsl 的类型检查过于严格,无法对这些不同的数据类型进行直接比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 2019-04-22
    相关资源
    最近更新 更多