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) &gt; 0
            </if>
            <if test="type == '1'">
                AND (QuantityInEntryUnit - ArtificialConsume - AutomaticConsume) &lt;= 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类型的postingDateString类型的type进行比较而导致的。

解决方案:

  1. selectVmiListForQuantity方法的参数类型由DateString改为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 语句并传入转换后的日期参数
    // ...
}
  1. 修改 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错误。

VMI 物料文档查询 SQL 语句优化和错误解决

原文地址: https://www.cveoy.top/t/topic/lH8z 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录