无法从复合键检索确切的id

4ngedf3f  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(328)

我无法从复合键检索到确切的id。
我正在使用mysql和hibernate。

Session session = sessionFactory.openSession();
        Criteria criteria = session.createCriteria(ProductId.class);
        criteria.setProjection(Projections.max("id"));
        criteria.setMaxResults(1);
        Integer max = (Integer) criteria.uniqueResult();

        if (max == null) {
            max = 0;  
//This always giving null.

确实如此 max =0; 在插入之前或之后,数据库中没有问题。
但是找回 id 通过使用:

productId.getId();

也总是给零,但在数据库中它是递增的 id .
为什么会这样?
它不能导致它有价值:

ProductId productId = new ProductId(id, barcode);
        product.setName(name);
        product.setPrice(price);
        product.setId(productId);
``` `id` 是主键,自动递增且唯一,但 `barcode` 只是主键。
这两个字段都是复合键。
总结:
当我跳过它时

java.lang.NullPointerException

因此,如果它被初始化,它可以在插入时自动生成id,即使只是放入“0”

ProductId productId = new ProductId(0, barcode);

完成插入。
但我无法准确地检索 `id` . 
我正在使用以下方法保存产品:

String name = jNameTextField.getText();
double price = Double.parseDouble(jPriceTextField.getText());
int barcode = Integer.parseInt(jBarcdTextField.getText());

ProductId productId = new ProductId(0, barcode); // put zero for check
product.setName(name);
product.setPrice(price);
product.setId(productId);

manager.addProduct(product);

产品.java

public class Product implements java.io.Serializable {

 public ProductId id;
 private String name;
 private double price;
 private Stock stock;

public Product() {
}

public Product(ProductId id, String name, double price) {
    this.id = id;
    this.name = name;
    this.price = price;
}
public Product(ProductId id, String name, double price, Stock stock) {
   this.id = id;
   this.name = name;
   this.price = price;
   this.stock = stock;
}

// Getter and Setters

谢谢您。
sd2nnvve

sd2nnvve1#

我仍然建议删除productid类,因为其中的id值是唯一的。但是,要使查询与productid类一起工作:

Criteria criteria = session.createCriteria(Product.class);

将条件更改为在product类而不是productid类上。
我认为(但我不确定)下面的更改也是必要的,将hibernate指向productid字段的int id字段。

criteria.setProjection(Projections.max("id.id"));

我还建议更改两个id字段之一的名称,以减少代码的混乱。

相关问题