2013-04-24 2 views
0

Это первый раз, когда я разрабатываю приложение Java и сразу сталкиваюсь с проблемой. Теперь у меня есть запрос SQL, как показано ниже:JOIN 3 Entities in JPA

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

+0

Я использую: 'javax.persistence.criteria.Join' –

+0

Не могли бы вы объяснить больше и дать нам более подробную информацию. – Khalil

ответ

-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

Спасибо, чувак, но эти способы не помогают :( –

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

Неверная ссылка. Если ваш 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"); 
...