2017-02-24 70 views
0

我有一個像下面三個相關表格:加入兩個,三個相關的表通過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 | 
..... 

首先我和連接第一和第二臺的戰鬥。用姓名和金額連接。

我想是這樣的:

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 

不斷變化的,以多種方式本節:where c.orders:=o.customer 最常見的錯誤是空指針異常。

之前在SQL做到了這一點: 表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; 

表CUSTOMER_ID < - > 3最EXP。訂單+日期

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; 

客戶:

@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<>(); 

訂單:

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

點是如何正確HQL做到這一點?下一步將通過姓氏進行搜索並獲得像'我的目標'這樣的結果。

我的目標是:

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

請詳細說明您的目標輸出 –

+0

@RaymondNijland你是什麼意思? – twistezo

+0

向我們展示了基於示例數據的預期輸出不僅列標題 –

回答

0

我想出瞭如何將這些SQL查詢轉換爲HQL。 爲了:

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

嘗試這些查詢

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 

每姓氏3個最貴的訂單,你需要使用用戶變量來創建排名。 並對該排名進行過濾。

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

謝謝@RaymondNijland它的工作,但我需要在HQL – twistezo

+0

@twistezo iam與HQL不知道,但我認爲你可以使用'session.createSQLQuery(query).list()'來讀取https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html –