【问题标题】:SQLDataException: An attempt was made to get a data value of type 'VARBINARY' from a data value of type 'VARCHAR'SQLDataException:试图从“VARCHAR”类型的数据值中获取“VARBINARY”类型的数据值
【发布时间】:2013-03-19 06:57:17
【问题描述】:

我正在尝试在下面的Hibernate查询中设置参数的值:

public List<Transactions> getTransactions(long cardNum, String type) {
    Query q1 = factory.getCurrentSession().createQuery("FROM bank.persistence.entity.Transactions WHERE PK_CRED_CARD_ID=:CardID AND TRANSACTION_TYPE=:trType");
    q1.setParameter("CardID", cardNum);
    q1.setParameter("trType", type);
    return q1.list();
}

但我收到以下错误,问题似乎出在 String 类型的值上:

java.sql.SQLDataException: An attempt was made to get a data value of type 'VARBINARY' from a data value of type 'VARCHAR'.

这里是 Transactions 实体类:

package bank.persistence.entity;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;

@Entity
public class Transactions implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int ID;

    @Column(name = "TRANSACTION_TYPE")
    private String transType;

    @Column(name = "AMOUNT")
    private float amt;

    @Column(name = "DESCRIPTION")
    private String desr;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "TRANSACTION_DATE")
    private Date tranDate;

    @ManyToOne
    @JoinColumn(name = "PK_ACCT_ID")
    private Account account;

    @ManyToOne
    @JoinColumn(name = "PK_CRED_CARD_ID")
    private CreditCard credCard;

    // getter and setter for all attributes

}

【问题讨论】:

  • 亲爱的 ktj,您检查过您设置的参数是否为“空”值?
  • @kjt - 检查我的答案并尝试一下。
  • 接受解决你问题的答案,这样就知道这个问题已经回答了。

标签: java hibernate jakarta-ee


【解决方案1】:

我认为您在实体和数据库中提供的数据类型是不同的。使它们都相同。 在实体中将其设为String

@Column(name = "TRANSACTION_TYPE" type="String") 

我认为其中一个 cardNum ,类型为空

【讨论】:

  • 事务类后面部分:这里的数据类型是String @Column(name = "TRANSACTION_TYPE") private String transType;
  • @ktj 我认为其中一个 cardNum ,类型为空
【解决方案2】:

既然是 HQL,你的查询应该是这样的:-

Query q1 = factory.getCurrentSession().createQuery("FROM bank.persistence.entity.Transactions T 
WHERE T.credCard.id=:CardID AND T.transType=:trType"); 

您需要提供映射到列的变量。不是直接的列名。 我假设CreditCard 表中的 ID 列是 id。如果不是,请将其更改为相关的内容。

【讨论】:

    【解决方案3】:

    如果所有类型都很好,则检查您在 setParameter() 中设置的值是否为空,在这种情况下,休眠将抛出此错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多