0

这是我第一次开发 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>)?这个消息对我来说很奇怪(因为我是新手)。谢谢

4

3 回答 3

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的其他问题

您自己构建元模型类吗?还是您使用了持久性框架提供的“元模型生成器”?

希望这可以帮助。

于 2013-04-24T13:04:31.153 回答
0

您的加入不正确。如果您RootProduct( 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");
...
于 2013-04-24T13:09:46.813 回答
-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;

}
于 2013-04-24T11:42:50.493 回答