【发布时间】:2013-09-12 07:42:18
【问题描述】:
这是我的发件人实体
@Entity
public class Sender {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long senderId;
...
...
public long getSenderId() {
return senderId;
}
public void setSenderId(long senderId) {
this.senderId = senderId;
}
}
当我尝试执行以下查询时:
StringBuilder query = new StringBuilder();
query.append("Select sender.* ");
query.append("From sender ");
query.append("INNER JOIN coupledsender_subscriber ");
query.append("ON coupledsender_subscriber.Sender_senderId = sender.SenderId ");
query.append("WHERE coupledsender_subscriber.Subscriber_subscriberId = ? ");
SQLQuery q = (SQLQuery) sessionFactory.getCurrentSession().createSQLQuery(query.toString());
q.setResultTransformer(Transformers.aliasToBean(Sender.class));
q.setLong(0, subscriberId);
return q.list();
出现以下错误:
错误:org.hibernate.property.BasicPropertyAccessor - HHH000123:类中的 IllegalArgumentException:be.gimme.persistence.entities.Sender,属性的设置方法:senderId
错误:org.hibernate.property.BasicPropertyAccessor - HHH000091:预期类型:long,实际值:java.math.BigInteger
这是因为 Sender 类中的 senderId 实际上是 long 而不是 BigInteger(由 Hibernate 返回)。
我想知道在这种情况下最好的做法是什么,我应该使用 BigIntegers 作为 id(似乎有点矫枉过正)?
我是否应该手动将查询结果转换为 Sender 类的对象(那会很可惜)?或者我可以让 Hibernate 返回long id 而不是BigIntegers?还是有其他想法?
我正在使用 Spring、Hibernate 4.1.1 和 MySQL
【问题讨论】:
-
你的数据库中有大整数类型吗?确保您的对象映射正确。
-
是的,它们都是 BIGINT(20) 类型。但这些是 Hibernate 生成的表。
-
这里有很多不清楚的地方。无论原因是什么,您的映射都应该正确地映射到数据库。我排除了隐式装箱、拆箱和铸造问题。如果您有混合名称,
Transformers.aliasToBean可能会将错误的 db 字段映射到类对象。 -
@erencan 我已将我的发件人实体添加到问题中。但我不认为长 id 不应该映射 BIGINT(20) 到 MySQL(在 MySQL 中还有什么其他类型是正确的?)。
-
你能把 BIGINT(20) 改成 int 吗?因为 BigInteger 不能隐式转换为 long。
标签: java spring hibernate long-integer biginteger