我正在使用Hibernate本机查询进行SELECT查询,如下所示:
public List<SomeDTO> findDTOs() {
StringBuilder sql = new StringBuilder();
sql.append(" SELECT id as id, localDateColumn as date, ");
sql.append(" FROM t");
Query query = entityManager.createNativeQuery(sql.toString());
query.unwrap(SQLQuery.class)
.addScalar("id", StandardBasicTypes.LONG)
.addScalar("localDateColumn", DateType.INSTANCE)
.setResultTransformer(Transformers.aliasToBean(SomeDTO.class));
return query.getResultList();
}
我尝试使用StandardBasicTypes.DATE
或DateType.INSTANCE
无效。我知道映射java.sql.Types#DATE
和java.util.Date
很好。
我想知道如何将java.sql.Types#DATE
映射到java.time.LocalDate
。
答案 0 :(得分:1)
由于我没有使用Entity
作为返回数据类型。 AttributeConverter
在这种情况下没有用。
我通过在字段的设置器中将java.util.Date
手动转换为java.time.LocalDate
来解决此问题。
设置器将如下所示:
public void setLocalDateColumn(java.util.Date value){
// convert into LocalDate
// set
}
如果您在转换时得到UnsupportedOperationException
。您可能仍将java.sql.Date
包裹在java.util.Date
中。这样做:
Instant.ofEpochMilli(value.getTime()).atZone(DefaultZoneId).toLocalDate();
答案 1 :(得分:0)
您可以使用 AttributeConverter 将java.sql.Date
映射到java.time.LocalDate
。
import java.sql.Date;
import java.time.LocalDate;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
@Converter(autoApply = true)
public class LocalDateConverter implements AttributeConverter<LocalDate, Date> {
@Override
public Date convertToDatabaseColumn(LocalDate localDate) {
return (localDate == null ? null : Date.valueOf(localDate));
}
@Override
public LocalDate convertToEntityAttribute(Date sqlDate) {
return (sqlDate == null ? null : sqlDate.toLocalDate());
}
}
答案 2 :(得分:0)
您的方法有很多错误。
使用String串联构建SQL的方式非常冒险,并且可能会将您的应用程序暴露给SQL injection attacks。
@Field("can_id")
更多,这甚至不正确,因为您在StringBuilder sql = new StringBuilder();
sql.append(" SELECT id as id, localDateColumn as date, ");
sql.append(" FROM t");
Query query = entityManager.createNativeQuery(sql.toString());
子句之前附加了,
。如果要动态生成查询,则需要使用Criteria API。
您将FROM
列设置为localDateColumn
别名,如下所示:
date
但是,当您使用sql.append(" SELECT id as id, localDateColumn as date, ");
设置休眠类型时,可以使用localDateColumn
:
addScalar
现在,根据您的问题标题,如果.addScalar("localDateColumn", DateType.INSTANCE)
是MySQL localDateColumn
列类型,并且您想将其映射到DATE
Java对象,则应这样做这个:
LocalDate