在JPA查询中使用Hibernate CompositeUserType

我正在使用CompsiteUserType来映射类“单元”:

class Unit {
  long type;
  Currency currency;
  Currency crossCurrency;
}

('Money','XRate',...)的字段'crossCurrency'可能为空(例如'Money'没有交叉货币)。

CompositeUserType的'nullSafeSet'方法实现如下:

public void nullSafeSet(...) {
  Unit unit = (Unit) value;
  stmt.setLong(index, unit.type);
  if(unit.type == UnitType.MONEY) {
    stmt.setLong(index+1, unit.currency.id);
    stmt.setNull(index+2, java.sql.Types.BIGINT);
  } else if(unit.type == UnitType.XRate) {
    stmt.setLong(index+1, unit.currency.id);
    stmt.setLong(index+2, unit.crossCurrency.id);
  } else {
    ...
  }
}

现在我有一个JPA查询,试图根据他们的“单元”来查找实体:

SELECT p FROM Position WHERE p.unit = :unit

当执行这个查询时,Hibernate生成一个SQL查询:

SELECT id, ... 
FROM positions p
WHERE (p unit_type, p unit_currency_id, p unit_cross_currency_id)=(?, ?, ?)

如果给查询的'单位'是'金钱',那么具体的查询是:

SELECT p.id, ...
FROM positions p
WHERE (p.unit_type, p.unit_currency_id, p.unit_cross_currency_id)=('money', 1, null)

在这种情况下,数据库中找不到匹配的行,因为查询的where子句检查'unit_cross_currency_id'是否等于'null',这永远不会匹配。

我在这里做错了什么?

如何在JPA查询中使用具有可能的空值的组合用户类型?

链接地址: http://www.djcxy.com/p/63819.html

上一篇: Using Hibernate CompositeUserType in JPA Queries

下一篇: Passing empty list as parameter to JPA query throws error