EJB 3 problem z NamedQuery's

0

Hej mam pytanie odnosnie EJB 3.0
dotyczace NamedQuery's
Tworze 2 rodzaje zapytań:
Native, z osobna klasa do mapowania wynikow:

- @NamedNativeQuery(name = "Query1Native", query = "SELECT DISTINCT c.companyName as ccn FROM Customers c, Order_Details od, Orders o where c.customerID = o.customerID and od.orderID=o.orderID and od.Quantity>12",resultClass = Mapping1.class),

 - @NamedNativeQuery(name = "Query2Native", query = "SELECT CU.CompanyName as cun,CU.Country as cuc,sum(OD.Quantity)as Quan from Customers CU, Orders O, Order_Details OD,Products P where CU.customerID = O.customerID and O.OrderID = OD.OrderID and OD.ProductID = P.ProductID and P.UnitsInStock > 10 group by CU.CompanyName,CU.Country",resultClass = Mapping2.class)

Obydwa działaja bez zarzutu.

Natomiast chce rowniez stworzyc analogiczne(lub podobne) zapytania w EJB QL(do utrwalania danych uzywam Hibernate Persistance):

- @NamedQuery(name = "Query1", query = "SELECT DISTINCT c.companyName FROM Customers c,in(c.orders) o, in(o.order_details) od WHERE od.quantity > 12"),
- @NamedQuery(name = "Query2", query = "select c.companyName from Customers c, in(c.Orders) o, in(c.OrderDetails) od,Products p, in(OrderDetails) od1 where od.productId = od1.productId and od.orderId = od1.orderId and p.unitsInStock > 12")

i dostaje odpowiednio wyjatki:

org.hibernate.QueryException: could not resolve property: orders of: EJB3.Customers [SELECT DISTINCT c.companyName FROM EJB3.Customers c,in(c.orders) o, in(o.order_details) od WHERE od.quantity > 12]
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:67)
at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:61)
...

org.hibernate.QueryException: could not resolve property: Orders of: EJB3.Customers [select c.companyName from EJB3.Customers c, in(c.Orders) o, in(c.OrderDetails) od,EJB3.Products p, in(OrderDetails) od1 where od.productId = od1.productId and od.orderId = od1.orderId and p.unitsInStock > 12]
...

Wydaje mi się ze jest to problem z odzwierciedleniem relacji Customers->Orders(Orders to osobna tabela w relacji C(1)-O(0,n))
Probowałem na kilka sposobów zmienic to zapytanie,ale kazdorazowo podczas deploymenty JBoss wyrzuca wyjatek...
Moze ktos podpowie mi w czym tkwi problem??

0

A daj tu jeszcze kod klas Customers i Orders z opisem mapowań. Bo problem może nie leżeć w samych zapytaniach/mapowaniach co w kodzie klas. Jak dla mnie to JPA nie widzi pola orders w Customers.

0

Klasy Customers i Orders przedstawiaja sie nastepujaco
Customers

@Entity
@Table(name = "customers")
@NamedQueries(<lista zapytan>)
@NamedNativeQueries(<lista zapytan>)

public class Customers implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "CustomerID")
    private String customerID;
    @Basic(optional = false)
    @Column(name = "CompanyName")
    private String companyName;
    @Column(name = "ContactName")
    private String contactName;
    @Column(name = "ContactTitle")
    private String contactTitle;
    @Column(name = "Address")
    private String address;
    @Column(name = "City")
    private String city;
    @Column(name = "Region")
    private String region;
    @Column(name = "PostalCode")
    private String postalCode;
    @Column(name = "Country")
    private String country;
    @Column(name = "Phone")
    private String phone;
    @Column(name = "Fax")
    private String fax;

+ konstruktor metody set oraz get 

Orders

@Entity
@Table(name = "orders")
@NamedQueries(<lista zapytan>)
@NamedNativeQueries(<lista zapytan>)

public class Orders implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "OrderID")
    private Integer orderID;
    @Column(name = "CustomerID")
    private String customerID;
    @Column(name = "EmployeeID")
    private Integer employeeID;
    @Column(name = "OrderDate")
    @Temporal(TemporalType.TIMESTAMP)
    private Date orderDate;
    @Column(name = "RequiredDate")
    @Temporal(TemporalType.TIMESTAMP)
    private Date requiredDate;
    @Column(name = "ShippedDate")
    @Temporal(TemporalType.TIMESTAMP)
    private Date shippedDate;
    @Column(name = "ShipVia")
    private Integer shipVia;
    @Column(name = "Freight")
    private BigDecimal freight;
    @Column(name = "ShipName")
    private String shipName;
    @Column(name = "ShipAddress")
    private String shipAddress;
    @Column(name = "ShipCity")
    private String shipCity;
    @Column(name = "ShipRegion")
    private String shipRegion;
    @Column(name = "ShipPostalCode")
    private String shipPostalCode;
    @Column(name = "ShipCountry")
    private String shipCountry;

+ konstruktor metody set oraz get
0

No i jasne. W SQLu (NativeQueries) możesz łączyć obiekty w praktyce dowolny sposób. Zależności pomiędzy krotkami są budowane w ramach zapytania, a nie struktury tabel. Można zatem zbudować zapytanie pomiędzy dwoma nie powiązanymi niczym tabelami. W JPA używamy OQL (Object Query Language), a dokładnie JPQL, co wymusza trochę inne podejście. Nie można zadać pytania o pole, w tym przypadku c.orders, jeżeli obiekt nie posiada tego pola.
Poprawnie skonstruowane obiekty powinny posiadać zależności pomiędzy sobą:
<coda=java>
class Customer{

/// fetch = FetchType.EAGER - ładuje wszystko na raz. Inną, domyślną, metodą jest LAZY.
@ManyToOne(fetch = FetchType.EAGER)
@JoinTable(name = "customer_order", joinColumns = @JoinColumn(name = "CUSTOMER_ID", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "ORDER_ID", referencedColumnName = "ID"))
private List<Order> orders;

}

czy jakoś tak.
0

Encje generowalem NetBeans'em i prawde powiedziawszy nawet nie zwrocilem wiekszej uwagi na kod,poczatkowo przetestowalem wyszukiwanie tylko na pojedynczych encjach i jak widac to byl moj blad.
Dzieki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1