复合键上的 Hibernate SELECT 给出了意外的字符错误
Hibernate SELECT on Composite Key gives unexpected char error
我有一个名为 table 的打印机,它有 3 个 varchar2 字段组成一个复合 ID,一个 Printer.java class,和一个 PrinterID.java class(对于复合 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;
代码在另一个 class...
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: unexpected char: '@' [from Printer where
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那么请给我留言。
我有一个名为 table 的打印机,它有 3 个 varchar2 字段组成一个复合 ID,一个 Printer.java class,和一个 PrinterID.java class(对于复合 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;
代码在另一个 class...
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: unexpected char: '@' [from Printer where 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那么请给我留言。