VMI 物料文档查询 SQL 语句优化和错误解决
VMI 物料文档查询 SQL 语句优化和错误解决
以下代码展示了 VMI 物料文档查询的 SQL 语句,并解决查询时出现的java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String错误。
原始代码:
List<VmiMaterialDocument> selectVmiListForQuantity(@Param("postingDate") Date postingDate, @Param("type") String type);
<select id="selectVmiListForQuantity" resultType="org.jeecg.modules.odsMaterialDocumentService.entity.VmiMaterialDocument">
SELECT
Material as material, Batch as batch, PostingDate as postingDate,quantityInEntryUnit as quantityInEntryUnit,
(QuantityInEntryUnit - ArtificialConsume - AutomaticConsume) as availableInventory,ArtificialConsume as artificialConsume,
SUM(QuantityInEntryUnit - ArtificialConsume - AutomaticConsume) as totalQuantity,AutomaticConsume as automaticConsume
FROM
vmi_materialdocument
<where>
<if test="postingDate != null and postingDate != ''">
DATE_FORMAT(PostingDate, '%Y-%m') = DATE_FORMAT(#{time}, '%Y-%m')
</if>
<if test="type == '0'">
AND (QuantityInEntryUnit - ArtificialConsume - AutomaticConsume) > 0
</if>
<if test="type == '1'">
AND (QuantityInEntryUnit - ArtificialConsume - AutomaticConsume) <= 0
</if>
</where>
ORDER BY PostingDate ASC
</select>
错误信息:
### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
### Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
错误原因:
这个错误是由于在 SQL 语句中,试图将Date类型的postingDate和String类型的type进行比较而导致的。
解决方案:
- 将
selectVmiListForQuantity方法的参数类型由Date和String改为String类型,然后在方法内部将其转换为Date类型。
List<VmiMaterialDocument> selectVmiListForQuantity(@Param("postingDate") String postingDate, @Param("type") String type) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(postingDate);
} catch (ParseException e) {
e.printStackTrace();
}
// 调用 SQL 语句并传入转换后的日期参数
// ...
}
- 修改 XML 文件中的 SQL 语句,将
postingDate参数的比较方式改为与String类型的type参数进行比较。
<if test="postingDate != null and postingDate != ''">
DATE_FORMAT(PostingDate, '%Y-%m') = DATE_FORMAT(#{postingDate}, '%Y-%m')
</if>
注意:
- 如果
postingDate的格式不是yyyy-MM-dd,则需要相应地修改SimpleDateFormat的格式。 - 修改完代码后,请重新编译并运行应用程序,以验证问题是否解决。
通过以上两种方法,就可以解决java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String错误。
原文地址: https://www.cveoy.top/t/topic/lH8z 著作权归作者所有。请勿转载和采集!