【问题标题】:The data types datetime and time are incompatible in the greater than or equal to operator数据类型 datetime 和 time 在大于或等于运算符中不兼容
【发布时间】:2014-05-14 02:17:42
【问题描述】:

我在数据库表的列中有一个变量类型时间。 我如何将java中的这个值与这个字段进行比较我的意思是我可以使用日期,gregoriancalendar? 我试过了,我仍然有这个消息,请有人给我建议

Date d2 = new Date();                      // timestamp now
Calendar cal = Calendar.getInstance();       // get calendar instance
cal.setTime(d2);                           // set cal to date
cal.set(Calendar.HOUR_OF_DAY, 10);            // set hour to midnight
cal.set(Calendar.MINUTE, 30);                 // set minute in hour
cal.set(Calendar.SECOND, 0);                 // set second in minute
cal.set(Calendar.MILLISECOND, 0);            // set millis in second
Date d3 = cal.getTime();   

@SuppressWarnings("unchecked")
List<Asistencia> list = (List<Asistencia>) sessionFactory
.getCurrentSession()
.createQuery(
        "select new Asistencia( asis.idAsistencia,"
        + "asis.horaInicio, asis.horaFin) "
        + "from Asistencia asis "
        + "where :hour >= asis.horaInicio and :hour <= asis.horaFin")

.setParameter("hour", d3).list();

我也用过

where :hour between asis.horaInicio and asis.horaFin

和消息是一样的:

ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - The data types datetime and time are incompatible in the greater than or equal to operator.

数据类型 datetime 和 time 在大于等于运算符中不兼容。

这里是 Asistencia 类:

public class Asistencia implements java.io.Serializable {

private static final long serialVersionUID = 1L;
private long idAsistencia;
    private Date horaInicio;
    private Date horaFin;
    private int idAula;
    private int idCurso;
    private int idPeriodo;
    private Date fecha;

    public Asistencia (){
    }
    public Asistencia (long idAsistencia, Date horaInicio, Date horaFin){
          this.idAsistencia
          this.horaInicio = horaInicio;
          this.horaFin = horaFin;
    }

}

【问题讨论】:

  • 准备好了,我更新了帖子@oshingc
  • 尝试在您的实体中使用@Temporal 注解。
  • 不确定这是否可行,但请尝试将您的参数设置为 java.sql.Time 变量。

标签: java sql-server hibernate hql


【解决方案1】:

似乎唯一的问题是我使用的是 SQL Server 2008,并且有必要将 sendTimeAsDateTime=false 放在连接属性中。

这里有一个类似的问题。 comparing time in sql server through hibernate

【讨论】:

    【解决方案2】:

    在调用传递空日期的 JpaRepository API 时,我在使用 SpringBoot(v2.2.2) 和 MSSQL 服务器 (jdbc7.4.1) 时遇到了这个错误。这是第一个版本的 Repository API

    @Query(value = "SELECT t FROM MyEntity t WHERE "
     + " AND ( ?3 IS NULL OR ( ?3 IS NOT NULL AND t.fromDate<= ?3 ))"
     + " AND ( ?2 IS NULL OR ( ?2 IS NOT NULL AND t.toDate>= ?2 ))") 
    List<MyEntity> getMyEntity(LocalDate fromDate, LocalDate toDate);
    

    当为输入日期调用具有空值的 API 时出现异常:

    The data types date and varbinary are incompatible in the less than or equal to operator
    

    我用 CAST 解决了:

    @Query(value = "SELECT t FROM MyEntity t WHERE "
     + " AND ( ?3 IS NULL OR ( ?3 IS NOT NULL AND t.fromDate<= CAST( ?3 AS date ) ))"
     + " AND ( ?2 IS NULL OR ( ?2 IS NOT NULL AND t.toDate>= CAST( ?2 AS date ) ))")
    List<MyEntity> getMyEntity(LocalDate fromDate, LocalDate toDate);
    

    【讨论】:

      【解决方案3】:

      如果不设置 sendTimeAsDateTime 属性,该属性不适用于早于 3.0 的 SQL Server 驱动程序(出于某种原因,我们中的一些人坚持使用现有的东西),您可以尝试使用字符串而不是日期。这对我使用 PreparedStatement 很有用,我敢打赌它也适用于这种情况。将第一个代码块的最后一行更改为:

      .setParameter( "hour", new SimpleDateFormat("HH:mm:ss.SSS").format(d3) ).list();
      

      【讨论】:

        【解决方案4】:

        我在通过 spring-data-jpaeclipselinkjavax.time.LocalDate 类型的实体属性查询数据时遇到了同样的问题。连接设置sendTimeAsDateTime=false 没有帮助。通过将spring-data-jpa 转换器&lt;class&gt;org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters$LocalDateConverter&lt;/class&gt; 添加到persistence.xml 文件中已解决此问题。希望这会有所帮助。

        【讨论】:

          【解决方案5】:

          我也有同样的问题。我的 sql 数据类型是Time(7),每次我想通过 JPQL 查询比较它时,都会出现该错误。连接字符串sendTimeAsDateTime=false 不起作用。将&lt;class&gt;org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters$LocalDateConverter&lt;/class&gt; 添加到persistence.xml 也不起作用。

          我所做的是,将数据Time(7)从sql存储到String,例如这是我在sql上的表设计

          StartTime   time(7) 
          

          在我的 java 类中,我将该字段存储到 String 变量中

          @Entity
          @Table(name = "tableSchedule")
          public class TableSchedulue implements Serializable {
              private static final long serialVersionUID = -9112498278775770919L;
              ....
              @Column(name = "StartTime")
              private String startTime;
              .....
          }
          

          当我使用这样的 JPQL 查询时(在存储库中)

          @Query(value = "SELECT a "
                      + "FROM TableSchedule a "
                      + "WHERE a.startTime <= ?1 ")
              List<TableSchedulue > getTestData(String startTime);
          

          你的字符串格式必须HH:mm:ss
          有用。希望对你有帮助

          缺点:因为在 SQL 中类型是 Time(7),所以 SQL 中的值 08:00:00 在持久性中将变为 08:00:00.0000000,因此您需要将其解析为您的需求

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-06-02
            • 1970-01-01
            • 1970-01-01
            • 2014-02-13
            • 1970-01-01
            • 2017-03-23
            • 1970-01-01
            相关资源
            最近更新 更多