我有一个名为printer的表,具有3个varchar2字段,它们构成一个复合ID,一个Printer.java类和一个PrinterID.java类(用于复合ID)。
@Entity
public class Printer implements java.io.Serializable {
@EmbeddedId
@AttributeOverrides(
{
@AttributeOverride(name = "rep", column = @Column(name = "REP", nullable = false, length = 30)),
@AttributeOverride(name = "quarter", column = @Column(name = "QUARTER", nullable = false, length = 2)),
@AttributeOverride(name = "product", column = @Column(name = "PRODUCT", nullable = false, length = 20)),
}
)
private PrinterId id;
@Embeddable
public class PrinterId implements java.io.Serializable {
private String rep;
private String quarter;
private String product;
另一个类中的代码...
private Printer getPrinter(String a, String b, String c) {
Session session = // code to get and open a session
session.beginTransaction
PrinterId compId = new PrinterId(a, b, c);
Printer aPrinter = (Printer) session.load(Printer.class, compId);
return aPrinter;
}
我收到以下错误:
org.hibernate.QueryException:意外的字符:“@” [来自打印机
id = PrinterId @ 77c95c8b]
“@ 77c95c8b”是怎么回事-是来自PrinterId.hashCode()方法的吗?我该如何解决?
最佳答案
您可能怀疑PrinterId @ 77c95c8b看起来是Object.toString()的输出-使用哈希值。因此,首先要帮助的是@Override PrinterId的toString()方法以提供一个不错的输出(Eclipse和大多数其他IDE可以为您生成它)。就像是:
public String toString() {
return "PrinterId:" + rep + "," + quarter + "," + product;
}
但是,我不希望Hibernate在使用session.load()时尝试将id转换为字符串,因为您已经覆盖了属性并且无论如何它将参数化查询。我怀疑您正在某个地方创建SQL查询并直接使用id构建它,因此隐式使用toString方法,也许:
"SELECT ... FROM printer WHERE id = " + printerId;
可以通过参数化查询来避免这种情况。
如果您真的只使用session.load,请给我留言。