【发布时间】:2017-08-24 21:56:27
【问题描述】:
我有一个场景,我使用 org.hibernate.usertype.UserType 为 hibernate 中的实体字段使用自定义用户类型。
日期转换为 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 语句应该是 例如:SELECT * FROM Person p where p.birthDtTm = date;
日期在 UTC 时区中
【问题讨论】:
-
尝试使用 @Converter , javax.persistence.AttributeConverter 仍然看到相同的结果,有谁知道我会做错什么?遵循此文档click me
标签: hibernate jpa criteria jpa-criteria