2014-08-31 55 views
-1

有人可以幫我翻譯下面的postgresql查詢到EntyManager.createQuery嗎?如何使用EntyManager createQuery函數將postgresql select查詢轉換爲jpa?

SELECT distinct id.itemid, id.itemdetailid, id.property, id.propertyval 
FROM item_detail1 id 
join (SELECT distinct i.itemid 
     FROM item_detail1 id 
     join item i 
     on i.itemid = id.itemid 
     where 
     id.itemdetailid in (9,22,24,27)) myItems 
    on myItems.itemid = id.itemid 
join category_item ci 
    on ci.itemid = id.itemid 
where id.itemdetailid not in (9,22,24,27) and 
    ci.categoryid = 1005 and id.propertyval is not null 
order by id.property asc, id.itemdetailid asc 

以下是缺失的必需實體。我在內聯中的子查詢中遇到了最多的問題。我有以下jpa查詢但缺少子查詢連接。

SELECT distinct id.itemid, id.itemdetailid, id.property, id.propertyval 
FROM item_detail1 id 
join id.itemid i 
join i.categoryCollection c 
where id.itemdetailid not in (9,22,24,27) and 
    c.categoryid = 1005 and id.propertyval is not null 
order by id.property asc, id.itemdetailid asc 





@Entity 
@Table(name = "item_detail1") 
@XmlRootElement 
public class ItemDetail1 implements Serializable 
{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "itemdetailid") 
    private Integer itemdetailid; 

    @JoinColumn(name = "itemid", referencedColumnName = "itemid") 
    @ManyToOne 
    private Item itemid; 

..getters and setters 
}          


@Entity 
@Table(name = "item") 
@XmlRootElement 
public class Item implements Serializable 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "itemid") 
     private Integer itemid; 

    @ManyToMany(mappedBy = "itemCollection") 
    private Collection<Category> categoryCollection; 

    @OneToMany(mappedBy = "itemid") 
    private Collection<ItemDetail1> itemDetail1Collection; 

..getters and setters 
} 


@Entity 
@Table(name = "category") 
@XmlRootElement 
public class Category implements Serializable 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "categoryid") 
    private Integer categoryid; 


    @JoinTable(name = "category_item", joinColumns = 
    { 
     @JoinColumn(name = "categoryid", referencedColumnName = "categoryid") 
    }, 
    inverseJoinColumns = { 
     @JoinColumn(name = "itemid", referencedColumnName = "itemid") 
    }) 
    @ManyToMany 
    private Collection<Item> itemCollection; 

..getters and setters 
} 

謝謝。

+1

你試過了什麼?你期望有人拿出這個沒有任何實體? (因爲JPQL只使用實體字段) – 2014-08-31 07:24:41

+0

對不起,漫長的一天。 – fs2050 2014-08-31 09:02:12

+1

注意:'join(SELECT distinct i.itemid ....)'子查詢可以重寫爲'EXISTS(...)'構造。這更清晰,而且通常更快。 – wildplasser 2014-08-31 11:22:38

回答

0
SELECT DISTINCT id.itemdetailid, id.property, id.propertyval 
FROM ItemDetail1 id 
join id.itemid i 
join i.categoryCollection cc 
where id.itemdetailid not in :itemdetailid 
     and cc.categoryid = :categoryid 
     and id.propertyval is not null 
     and EXISTS(SELECT 1 
       FROM ItemDetail1 id2 
       where id2.itemdetailid in :itemdetailid 
       and id.itemid = id2.itemid) 
order by id.property asc, id.itemdetailid asc 
相關問題