2013-04-24 74 views
0

这是我第一次开发Java应用程序并立即面临问题。现在我有一个SQL查询如下:在JPA中加入3个实体

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

你的意思是HQL查询? – sanbhat 2013-04-24 11:35:39

+0

我正在使用:'javax.persistence.criteria.Join' – 2013-04-24 11:37:14

+0

您能否解释更多并给我们更多详细信息 – Khalil 2013-04-24 11:42:02

回答

-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; 

} 
+0

谢谢,伙计,但是这种方式并没有帮助: – 2013-04-24 11:52:38

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。

JPQL与NamedQueries: http://www.objectdb.com/java/jpa/query/named

也许这可以帮助您关于JPA 其他问题http://www.objectdb.com/java/jpa/query/criteria

你建立你自己的元模型类?或者您是否使用持久性框架提供的“元模型生成器”?

希望这会有所帮助。

0

您的连接不正确。如果您的RootProductRoot<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"); 
...