当前位置: 首页 > 知识库问答 >
问题:

如何防止Hibernate为基于名称的参数绑定假设数据类型

艾安和
2023-03-14

我刚刚注意到,Hibernate根据名称(可能是column或带注释的类)自动假定查询参数的数据类型。我试图将unix时间戳存储在MySQL数据库的BIGINT列中。当名称在数据库和我的(JPA)注释类中为timestamp时,Hibernate自动假定它是一个时态值,因此当我试图在查询中为该列绑定一个长值时,我会得到一个异常,因为Hibernate需要java.util.Date。当我在数据库和类中将此列重命名为“foobar”时,一切都按预期进行。我怎样才能阻止Hibernate做这样愚蠢的假设呢?

编辑:

CREATE TABLE candle
(
   `open` decimal(25,15) NOT NULL,
   `high` decimal(25,15) NOT NULL,
   `low` decimal(25,15) NOT NULL,
   `close` decimal(25,15) NOT NULL,
   `volume` decimal(15,2) NOT NULL,
   `symbol` varchar(255) NOT NULL,
   `exchange` varchar(255) NOT NULL,
   `timestamp` bigint NOT NULL,
   `width` bigint NOT NULL,
   PRIMARY KEY(`symbol`, `exchange`, `timestamp`, `width`),
   KEY idx_symbol (`symbol`),
   KEY idx_exchange (`exchange`),
   KEY idx_timestamp (`timestamp`),
   KEY idx_width (`width`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

JPA类:

@Entity(name="candle")
public class JpaCandle {

    @EmbeddedId
    private Key id;

    @Column
    private BigDecimal open;

    @Column
    private BigDecimal high;

    @Column
    private BigDecimal low;

    @Column
    private BigDecimal close;

    @Column
    private BigDecimal volume;

    public Key getId() {
        return id;
    }

    @Embeddable
    public static class Key implements Serializable {
        @Column
        private String symbol;

        @Column
        private String exchange;

        @Column
        private long timestamp;

        @Column
        private long width;
    }
}

查询:

TypedQuery<JpaCandle> q = em.createQuery("FROM candle WHERE symbol = :symbol AND width = :width AND timestamp >= :from AND timestamp <= :until ORDER BY timestamp ASC", JpaCandle.class);
q.setParameter("from", from.toEpochMilli());
q.setParameter("until", until.toEpochMilli());
q.setParameter("symbol", symbol);
q.setParameter("width", width.getSeconds());
List<JpaCandle> jpaCandles = q.getResultList();

共有1个答案

廉实
2023-03-14

timestamp是MySQL中的列类型。最好不要对列使用这样的名称。也许,MySQL会返回date这样的值类型。

 类似资料:
  • 问题内容: 我在HQL语句中绑定了命名参数,但只是没有被填充。 它输出类似这样的内容,这意味着未设置参数(coln,colv)并返回0条记录。 感谢您提供有关如何在HQL语句中绑定列名称的任何帮助。谢谢。马赫迪。 问题答案: 您不能将列名称绑定为参数。仅一列值。在绑定参数值和执行查询之前,在计算执行计划时必须知道该名称。如果您确实希望拥有这样的动态查询,请使用Criteria API或其他动态创建

  • 考虑以下代码: 在到达返回时转换为。不同于,我想保留这种区别。我也更喜欢将保留为类型,因为仅具有字符串的含义,并且接口在其他地方使用。 < li >当< code>$null被传递时,如何使< code>$x作为< code>$null出现? < li >有没有其他方法可以让我知道< code>$x是从< code>f内部< code>$null而不是< code>[string]::Empty传

  • 我有Java接口类。 我有另一个spec builder方法: 以上规范可用于创建客户端: 可用于调用下游客户端获取数据: 我创建了以下客户端规范静态映射:“ContentType”->DownstreamClientSpec 现在我有了一个处理程序方法: 除了contentType的switch语句和特定的客户端创建逻辑之外,我如何基于contentType获得客户端?使用Guice动态绑定特定

  • 我正在尝试使用mySql全文索引“匹配”语法进行查询。 我将Spring Boot版本从1.5.4.RELEASE更改为2.0.0m7,以使用spring data jpa版本2.0.2.Releases,因为在早期的spring data jpa版本中,带有countQuery的本机查询不起作用。 我已经用这里和这里的解决方案解决了几个问题。 当前的问题是以下错误: 这是代码 如果我尝试将可分页

  • 问题内容: 第二个表达式是类型擦除的结果吗? 我将如何定义Foo,以便可以使用Int参数化它,但仍然能够对其实例变量执行一些排序行为? 问题答案: 使用视图绑定。

  • 4.6 ROS参数名称设置 在ROS中节点名称话题名称可能出现重名的情况,同理参数名称也可能重名。 当参数名称重名时,那么就会产生覆盖,如何避免这种情况? 关于参数重名的处理,没有重映射实现,为了尽量的避免参数重名,都是使用为参数名添加前缀的方式,实现类似于话题名称,有全局、相对、和私有三种类型之分。 全局(参数名称直接参考ROS系统,与节点命名空间平级) 相对(参数名称参考的是节点的命名空间,与