這是我關于 stackoverflow 的第一個問題,如果有任何不準確的地方,請提前抱歉
在我的專案中,我使用 Hibernate(作為 ORM 框架)和 QueryDSL lib,PostgreSQL 作為資料庫。
基本上,我需要檢查串列“arr”的大小,它是某個“X”類的屬性,所以我用谷歌搜索并找到了一種使用帶有 querydsl 的 postgres 函式的方法(在你問之前,我不能按要求使用本機查詢):
BooleanBuilder builder = new BooleanBuilder();
builder.and(Expressions.booleanTemplate("function('array_length', {0})", qX.arr)
.castToNum(Integer.class).gt(0));
一切都編譯正常,但是當呼叫存盤庫方法時,我收到一個錯誤:
錯誤:“.”處或附近的語法錯誤 位置: ...
我檢查了一切,但沒有“。” 在那個位置和附近的位置也是如此。但是,設定后spring.jpa.show-sql=true我發現確實有一個“。” 符號在該位置的某處,結果 SQL 陳述句如下所示:
... and cast(array_length(.) as int4)>?
這意味著,JPA 不能將我的 'arr' 放在array_length()函式中(是這樣嗎?)
為什么會發生這種情況?難道我做錯了什么?先感謝您
我的物體類看起來像這樣:
@EqualsAndHashCode(callSuper = true)
@Entity
@Table
@Data
@NoArgsConstructor
@TypeDefs({
@TypeDef(name = "list-array", typeClass = ListArrayType.class)
})
public class X extends BaseClass {
// private fields
@Type(type = "list-array")
@Column(name = "arr", columnDefinition = "bigint[]")
@ElementCollection
@OrderColumn
private List<Long> arr;
}
我嘗試不使用 @ElementCollection 和 @OrderColumn 注釋,但這給了我轉換錯誤
uj5u.com熱心網友回復:
@ElementCollection并@OrderColumn在這里引起第一個問題。洗掉它們(并且正確設定架構)后,需要更正函式呼叫(SQL 模板)。
這個問題@ElementCollection和@OrderColumn是它們表示用于存盤串列/陣列作為一個物體的一部分的另一種方法。
@ElementCollection將元素存盤在單獨的表中,每個元素都在單獨的行中(每個元素都參考物體)。要“記住”正確的順序,@OrderColumn需要將an作為單獨表的一部分,因為如果未指定順序(https://stackoverflow.com/a/20050403),則行將以任意順序回傳。
相比之下,ListArrayTypeand@Column(columnDefinition = "bigint[]")將能夠將元素序列保存在物體行的一列中。因此,不使用單獨的表,并且由于元素未保存在單獨的行中,因此不需要額外的順序資訊。
所以沒有 @ElementCollection并且@OrderColumn串列映射已經正確設定。請注意,您的模式當前可能處于錯誤狀態,您需要確保bigint[]物體表中有一個列(例如,可以在洗掉@ElementCollection和時由休眠自動創建@OrderColumn)。
2.修復 PostgresQL 函式呼叫:array_length需要第二個引數指示回傳長度的陣列的維度(https://www.postgresql.org/docs/current/functions-array.html)。因此,如下指定模板字串應該會得到正確的結果:(
"function('array_length', {0}, 1)"
“1”是請求的陣列維度)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389175.html
標籤:PostgreSQL的 休眠 jpa jpql 查询dsl
上一篇:Hibernate-在沒有基表注釋的情況下擴展物體?
下一篇:圖的拓撲排序演算法
