gpt4 book ai didi

mysql - 从 java.sql.Date 到 java.time.LocalDate 的 Hibernate native SQL 查询类型映射

转载 作者:行者123 更新时间:2023-11-29 02:40:35 24 4
gpt4 key购买 nike

我正在使用 Hibernate native 查询执行 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.DATEDateType.INSTANCE,但它不起作用。我知道映射 java.sql.Types#DATEjava.util.Date 效果很好。

我想知道如何将 java.sql.Types#DATE 映射到 java.time.LocalDate

最佳答案

您的方法有很多问题。

SQL 注入(inject)攻击风险

使用字符串连接构建 SQL 的方式非常危险,可能会将您的应用程序暴露给 SQL injection attacks .

StringBuilder sql = new StringBuilder();
sql.append(" SELECT id as id, localDateColumn as date, ");

sql.append(" FROM t");
Query query = entityManager.createNativeQuery(sql.toString());

此外,它甚至不正确,因为您在 FROM 子句之前附加了 ,。您需要使用 Criteria API如果您想动态构建查询。

别名使用不当

您将 localDateColumn 列设置为 date 别名,如下所示:

sql.append(" SELECT id as id, localDateColumn as date, ");

但是当使用 addScalar 设置 Hibernate 类型时,您会使用 localDateColumn:

.addScalar("localDateColumn", DateType.INSTANCE)

现在,根据你的问题标题,如果 localDateColumn 是一个 MySQL DATE 列类型,并且你想将它映射到一个 LocalDate Java 对象,你应该这样做:

.addScalar("date", LocalDateType.INSTANCE)

关于mysql - 从 java.sql.Date 到 java.time.LocalDate 的 Hibernate native SQL 查询类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53166546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com