簡體   English   中英

JPQL多個JOIN查詢到同一表

[英]JPQL Multiple JOIN query to same table

給定一組參數傳遞給RESTful端點,我的Java代碼正在(動態)構造以下JPQL:

SELECT i FROM Item i JOIN FETCH i.itemCharacterizations ic2 WHERE 1 = 1 AND ic2.type = 2 AND ic2.intValue = 0 AND LOWER(i.externalId) LIKE :itemName

這導致以下錯誤:

<openjpa-2.2.0-r422266:1244990 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: "Encountered "ic2" at character 57, but expected: [",", ".", "GROUP", "HAVING", "INNER", "JOIN", "LEFT", "ORDER", "WHERE", <EOF>]." while parsing JPQL "SELECT i FROM Item i JOIN FETCH i.itemCharacterizations ic2 WHERE 1 = 1 AND ic2.type = 2 AND ic2.intValue = 0 AND LOWER(i.externalId) LIKE :itemName". See nested stack trace for original parse error.

這是我的Java代碼:

    .
    .
    .
    .
    List<Item> items = null;
    // Query base string - WHERE 1 = 1 used strictly for convenience purposes.
    StringBuilder queryBuffer = new StringBuilder();
    if (itemGradeLevelId == -1 && itemContentAreaId == -1) {
        queryBuffer.append("SELECT i FROM Item i WHERE 1 = 1");
    }
    else {
        queryBuffer.append("SELECT i FROM Item i");
        if (itemGradeLevelId > -1) {
            queryBuffer.append(" JOIN FETCH i.itemCharacterizations ic1");
        }
        if (itemContentAreaId > -1) {
            queryBuffer.append(" JOIN FETCH i.itemCharacterizations ic2");
        }
        queryBuffer.append(" WHERE 1 = 1");
        if (itemGradeLevelId > -1) {
            queryBuffer.append(" AND ic1.type = " + ItemCharacterizationTypeConstants.GRADE_LEVEL +
                               " AND ic1.intValue = " + itemGradeLevelId);
        }
        if (itemContentAreaId > -1) {
            queryBuffer.append(" AND ic2.type = " + ItemCharacterizationTypeConstants.CONTENT_AREA +
                               " AND ic2.intValue = " + itemContentAreaId);
        }
    }
    .
    .
    .
    .
    TypedQuery<Item> itemQuery = this.entityManager.createQuery(queryBuffer.toString(), Item.class);
    items = itemQuery.getResultList();
    return items;
}

我不確定要嘗試完成的正確語法是什么:

根據我的項目實體中定義的以下關系,選擇一個項目實體:

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "i_id")
private List<ItemCharacterization> itemCharacterizations;

以及以下ItemCharacterization Entity字段:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private long id;

@Basic
@Column(name="i_id")
private long itemId;

@Basic
@Column(name="ic_type")
private int type;

@Basic
@Column(name="ic_value")
private int intValue;

@Basic
@Column(name="ic_value_str")
private String strValue;

這個問題似乎已經得到回答。 只是為了說明造成問題的原因。

在查詢中

SELECT i FROM Item i JOIN FETCH i.itemCharacterizations ic2 WHERE 1 = 1 AND ic2.type = 2 AND ic2.intValue = 0 AND LOWER(i.externalId) LIKE :itemName

使用關聯的標識變量( ic2 ),這在JPA規范第4.4.5.3節中是不允許的,其中指出:

由FETCH JOIN子句右側引用的關聯必須是從查詢返回的實體或可嵌入對象引用的關聯或元素集合。

不允許為FETCH JOIN子句右側引用的對象指定標識變量, 因此對隱式獲取的實體或元素的引用不能出現在查詢的其他位置

由於查詢的目的不是fetch join兩個實體,而是將它們連接在一起,因此必須從查詢中刪除FETCH關鍵字,如下所示:

SELECT i FROM Item i JOIN i.itemCharacterizations ic2 WHERE 1 = 1 AND ic2.type = 2 AND ic2.intValue = 0 AND LOWER(i.externalId) LIKE :itemName

它應該返回Item的集合及其相關的ItemCharacterization實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM