复合键上的 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那么请给我留言。