我有一个场景,我使用org.hibernate.usertype.UserType为休眠中的实体字段使用自定义用户类型。
这是日期转换为 UTC
import org.hibernate.usertype.ParameterizedType;
import org.hibernate.usertype.UserType;
public final class UTCTimestampType implements ParameterizedType, UserType
{..}
我的实体类如下
@Entity
public class Person extends AbstractPerson
{
@Column(name = "BIRTH_DT_TM")
@Type(type = "com.myexample.hibernate.types.UTCTimestampType")
protected Date birthDtTm;
}
当当前时间大于出生日期时,我有两个查询要从 Db 中检索人
1)jpql中的一个,实际上按预期调用了UserType#nullSafeSet
2)但是如果我通过标准构建器构建相同的查询,则永远不会调用 UTCTimestampType 类中的UserType#nullSafeSet实现,并且查询只会执行。
不知道为什么会这样
这是我对案例 (1) 的示例单元测试
String query = "SELECT pFROM Person p where p.birthDtTm = :now";
Query q = entityManager.createQuery(query);
q.setParameter("now", new Date());
List<Person> persons= q.getResultList();
但是我的条件查询没有通过我的自定义 UserType 类
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Person> criteriaQuery = criteriaBuilder.createQuery(Person.class);
Root<Person> root = criteriaQuery.from(Person.class);
Predicate predicate = criteriaBuilder.greaterThanOrEqualTo(
root.get(Person_.birthDtTm), new Date());
criteriaQuery.where(predicate);
criteriaQuery.select(root);
TypedQuery<Person> q = entityManager.createQuery(criteriaQuery2);
List<Person> persons = q.getResultList();
我希望在执行查询之前将出生日期字段转换为 UTC 时区,这在 jpql 查询中有效,但在标准生成器中,从不调用自定义类型,并且查询以传递的时间执行。我的结束 sql 语句应该是 Ex:SELECT * FROM Person p where p.birthDtTm = date;
日期在 UTC 时区