我有一个名为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,请给我留言。

09-05 00:06