2017-02-24 8 views
0

Ich habe drei verknüpften Tabellen wie unten:Join zwei, drei verknüpften Tabellen von HQL

+-------------+---------+------------+ 
| customer_id | name | surname | 
+-------------+---------+------------+ 
|   1 | Jan  | Bielecki | 
|   2 | Adam | Bielen  | 
..... 

+----------+--------+---------------------+-------------+ 
| order_id | amount | date    | customer_id | 
+----------+--------+---------------------+-------------+ 
|  1 | 10.23 | 2017-02-15 00:00:00 |   1 | 
|  2 | 20.56 | 2017-02-16 00:00:00 |   1 | 
|  3 | 30.57 | 2017-02-17 00:00:00 |   2 | 
|  4 | 40.52 | 2017-02-18 00:00:00 |   2 | 
|  5 | 50.30 | 2017-02-19 00:00:00 |   1 | 
..... 

+-----------------+-----------+------------+----------+ 
| order_detail_id | item_name | item_price | order_id | 
+-----------------+-----------+------------+----------+ 
|    1 | item 1 |  2.00 |  1 | 
|    2 | item 2 |  2.50 |  1 | 
|    3 | item 3 |  3.00 |  1 | 
|    4 | item 4 |  4.00 |  2 | 
|    5 | item 5 |  5.50 |  2 | 
|    6 | item 6 |  7.60 |  3 | 
|    7 | item 7 |  5.00 |  3 | 
|    8 | item 8 |  3.00 |  4 | 
|    9 | item 9 |  7.00 |  4 | 
|    10 | item 10 |  8.00 |  4 | 
|    11 | item 11 |  2.00 |  5 | 
|    12 | item 12 |  2.50 |  5 | 
..... 

Zum einen mit connect ersten und zweiten Tabelle ich kämpfe. Für die Verbindung der Nachnamen mit der Summe des Betrages.

Ich bin wie diese versuchen:

select sum(o.amount) as totalSum 
from Order as o, 
Customer as c 
join c.surname as surname 
where c.orders:=o.customer 
group by o.customer 
order by sum(o.amount) desc 

mit diesem Abschnitt zu viele Möglichkeiten zu ändern: where c.orders:=o.customer Der häufigste Fehler ist Nullpointer.

Vor diesem in SQL getan: Tabelle CUSTOMER_ID < -> TOTAL_AMOUNT

SELECT customer_id, 
SUM(amount) as total_amount, 
COUNT(amount) as orders_quantity 
FROM softhis_db.orders 
GROUP BY customer_id; 

Tabelle CUSTOMER_ID < -> 3 meisten exp. Aufträge + Termine

SELECT orders.customer_id, orders.amount, orders.date 
FROM orders_details 
RIGHT JOIN orders 
ON orders.order_id = orders_details.order_id 
ORDER BY amount DESC 
LIMIT 3; 

Kunde:

@Entity 
@Table(name = "customers") 
public class Customer { 

@Id 
@Column(name = "customer_id") 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@Column(name = "name", length = 50) 
private String name; 

@Column(name = "surname", length = 50) 
private String surname; 

@OneToMany(mappedBy = "customer") 
private Set<Order> orders = new HashSet<>(); 

Auftrag:

@Entity 
@Table(name = "orders") 
public class Order { 

@Id 
@Column(name = "order_id") 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@Column(name = "date") 
private Date date; 

@Digits(integer = 5, fraction = 2) 
@Column(name = "amount") 
private BigDecimal amount; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "customer_id") 
private Customer customer; 

@OneToMany(mappedBy = "order") 
private Set<OrderDetail> ordersDetails = new HashSet<>(); 

Orderdetail:

@Entity 
@Table(name = "orders_details") 
public class OrderDetail { 

@Id 
@Column(name = "order_detail_id") 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Lon id; 

@Column(name = "item_name", length = 50) 
private String itemName; 

@Digits(integer = 5, fraction = 2) 
@Column(name = "item_price") 
private BigDecimal itemPrice; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "order_id") 
private Order order; 

Der Punkt ist, wie diese richtig in HQL zu tun? Der nächste Schritt ist die Suche nach Nachnamen und das Ergebnis wie 'Mein Ziel'.

Mein Ziel ist:

+---------+---------------+ 
| surname | sum of amount | 
+---------+---------------+ 
|Bielecki | 150.40  | 
|Bielen | 130.34  | 
...... 

+-----------------------------------+--------------------+ 
| surname | 3 most expensive orders | date    | 
+-----------------------------------+--------------------+ 
|Bielecki | 120.23     |2017-02-15 00:00:00 | 
|Bielecki | 80.20     |2017-02-18 00:00:00 | 
|Bielecki | 20.20     |2017-02-19 00:00:00 | 
+---------+-------------------------+--------------------+ 
|Bielen | 190.23     |2017-02-15 00:00:00 | 
|Bielen | 80.20     |2017-02-18 00:00:00 | 
|Bielen | 20.20     |2017-02-19 00:00:00 | 
+---------+-------------------------+--------------------+ 
..... 
+0

Bitte erarbeiten Ihr Ziel Ausgabe –

+0

@RaymondNijland was meinst du? – twistezo

+0

zeigt uns die erwartete Ausgabe anhand der Beispieldaten nicht nur Spaltenüberschriften –

Antwort

0

Ich habe herausgefunden, wie diese SQL-Abfragen in HQL übersetzt werden. Um:

1.

select o.customer.surname, sum(o.amount) as s from Order as o group by o.customer 

2.

select o.customer.surname, o.amount, o.date from Order as o, OrderDetail as od 
1

Versuchen Sie diese Abfragen

SELECT 
    customers.surname 
, SUM(amount) "sum of amount" 
FROM 
customers 
INNER JOIN 
orders 
ON 
    customers.customer_id = orders.customer_id 
GROUP BY 
    customers.surname 
ORDER BY 
customers.surname ASC 

Für die 3 teuersten Aufträge per Nachname Sie benötigen Benutzervariablen verwenden Ranking zu erstellen. Und Filter auf dieser Rangliste.

SELECT 
    customers.surname 
, orders_ranked.amount AS "3 most expensive orders" 
, orders_ranked.date 
FROM ( 
    SELECT 
    * 
    , (
    CASE 
     WHEN 
      @customer_id = orders.customer_id 
     THEN 
      @rank := @rank + 1 
     ELSE 
      @rank := 1 
     END 
    ) 
    AS 
     rank 
    , @customer_id := orders.customer_id  
    FROM 
    orders 
    CROSS JOIN (
    SELECT 
     @customer_id := 0 
     , @rank := 0 
    ) 
    AS 
     init_user_variables 
    ORDER BY 
    orders.customer_id ASC 
    , orders.amount DESC 
) 
    AS 
    orders_ranked 
INNER JOIN 
customers 
ON 
orders_ranked.customer_id = customers.customer_id  
WHERE 
    orders_ranked.rank <= 3 
+0

Vielen Dank @RaymondNijland es funktioniert, aber ich brauche das gleiche in HQL – twistezo

+0

@ twistezo iam nicht bekannt mit HQL .. aber ich denke, Sie können Verwenden Sie 'session.createSQLQuery (query) .list()' für diesen Read https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html –