这是我第一次开发Java应用程序并立即遇到问题。现在我有一个SQL查询,如下所示:
Select PD.* From product PD
join Stock SP on PD.id = SP.product_id
join storage SR on SR.id = SP.storage_id
join status ST on ST.storage_id = SR.id
where ST.id ='1qa7n234i'
我的实体:
public class Product extends MainEntity {
public Product(){}
public void setAtcKey(String pAtcKey) {
atcKey = pAtcKey;
}
}
public class StockPosition extends MainEntity {
public StockPosition(){}
@XmlIDREF
public Product getProduct() {
return product;
}
public void setProduct(Product pProduct) {
product = pProduct;
}
@XmlIDREF
public Storage getStorage() {
return storage;
}
public void setStorage(Storage pStorage) {
storage = pStorage;
}
}
public class Storage extends MainEntity {
public Storage(){}
@XmlTransient
public Station getStation() {
return station;
}
public void setStation(Station pStation) {
station = pStation;
}
}
public class Status extends MainEntity {
public Status(){}
}
所以我将它转换为CriteriaQuery,如:
CriteriaBuilder cb = getCriteriaBuilder();
CriteriaQuery<Product> query = cb.createQuery(Product.class);
Root<Product> product = query.from(Product.class);
Join<StockPosition, Product> sp = product.join(StockPosition_.product);
但是我收到了The method join(SingularAttribute<? super Product,Y>) in the type From<Product,Product> is not applicable for the arguments (SingularAttribute<StockPosition,Product>)
这样的错误消息?这条消息对我来说很奇怪(因为我是新手)。谢谢
答案 0 :(得分:1)
CriteriaBuilder cb = getCriteriaBuilder();
CriteriaQuery<Product> query = cb.createQuery(Product.class);
Root<Product> product = query.from(Product.class);
Join<StockPosition, Product> sp = product.join(StockPosition_.product);
我认为它应该是这样的:
CriteriaBuilder cb = getCriteriaBuilder();
CriteriaQuery<Product> query = cb.createQuery(Product.class);
Root<Product> product = query.from(Product.class);
Join<StockPosition, Product> sp = product.join(Product_.stockposition);
也许你会想到SQL连接的方式。
如果您不需要在运行时构建查询,则可以考虑使用JPQL。
使用NamedQueries的JPQL: http://www.objectdb.com/java/jpa/query/named
也许这可以帮助您解决有关JPA的其他问题 http://www.objectdb.com/java/jpa/query/criteria
您是否自己构建元模型类?或者你使用的是元模型生成器&#34;你的持久性框架提供了什么?
希望这有帮助。
答案 1 :(得分:0)
您的加入不正确。如果Root
位于Product
(Root<Product>
),则您必须使用Product
类中的属性加入。
在这种情况下,您的Product
类应定义如下属性:
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
private List<StockPosition> stackPositions;
然后按如下方式执行连接:
Join<Product, StackPosition> sp = product.join(Product_.stackPositions_);
Predicate p = cb.equal(sp.get(StackPosition_.id, "1qa7n234i");
...
答案 2 :(得分:-1)
如果您的数据库模型中存在一对一关系,那么拥有一个类和注释(如下所示)应该可以得到结果。
基本上,您将获取Stock
,并获取stock.storage.status
(根据@javax.peristence.JoinColumn
子句加入
class Product {
@OnetoOne
@JoinColumn(name="product_id")
Stock stock;
}
class Stock {
@OnetoOne
@JoinColumn(name="storage_id")
Storage storage;
}
class Storage {
@OnetoOne
@JoinColumn(name="storage_id")
Status status;
}