gpt4 book ai didi

java - 使用 hibernate 连接外键

转载 作者:行者123 更新时间:2023-12-02 01:34:55 25 4
gpt4 key购买 nike

我是一个 hibernate 初学者,在尝试使用 hibernate 连接 2 个表时遇到问题。我想做的是根据商店 ID 获取某个商店的产品列表,但我得到的是每个商店下列出的数据库中所有可用产品的列表。

这是 Product.java 的代码:

@Entity
@Table (name = "products")
public class Product implements Serializable{

/**
*
*/
private static final long serialVersionUID = -1001086120280322279L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column (name = "product_id")
private int product_id;

@Column(name = "product_name", unique=true)
private String product_name;

@JoinColumn(name = "store", referencedColumnName="store_id")
@ManyToOne(cascade=CascadeType.ALL)
private Store store;

等等..

这是 Store.java 的代码:

@Entity
@Table(name = "stores")
public class Store implements Serializable{
/**
*
*/
private static final long serialVersionUID = 4497252090404342019L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column (name = "store_id")
private int store_id;

@Column(name = "store_name", unique=true)
private String store_name;

@JoinColumn(name="store", referencedColumnName= "store_id")
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private List<Product> productList;

等等..

输出如下:(产品 A 应位于 Butik A 下,产品 B 位于 Butik B 下)

Butik: Butik A
Produkt: Banana A
Produkt: Morot A
Produkt: Banana B
Produkt: Apple B

Butik: Butik B
Produkt: Banana A
Produkt: Morot A
Produkt: Banana B
Produkt: Spple B

我有 2 个附加类,ProductDAO 和 StoreDAO 负责处理查询,这两个类中的代码相似,除了表名/类名之外。

public class ProductDAO { 
public static List<Product> getStoreProductsList() {
Session hibernateSession = HibernateUtil.getSession();
hibernateSession.beginTransaction();
Query query = hibernateSession.createQuery("from Product");
hibernateSession.getTransaction().commit();
List<Product> storeProducts = query.list();
return storeProducts;
}
}

有没有办法只用 hibernate 来解决这个问题?

谢谢

最佳答案

看完你的评论后。看起来你从来没有在那里设置条件,当然,那么,你最终会得到所有的产品,无论它们属于哪家商店。没有惊喜。您在哪里指定标准?

你可以这样做,

// One liner
List<Product> list = session.createQuery("from Product p where p.store.store_id = "
+" :storeId").setInteger("storeId", storeId).list();

或者您可以获取Store,然后获取Product列表,如下所示,

// Another one liner
List<Product> list = session.createCriteria(Store.class)
.add(Restrictions.eq("store_id", storeId)).list().getProductList();

另一种更简单的方法,我们知道store_id是主键,(感谢Pakore提醒我)

// And another. Changed to use load() instead of get() here. 
// Assuming non-existance is an error.
List<Product> list = (Store) session.load(Store.class,storeId).getProductList();

[已编辑]

...添加一些有用的指针(感谢 Pascal )

14.3 Associations and joins

14.4 Forms of join syntax

关于java - 使用 hibernate 连接外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3871043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com