我有一個SQL資料庫,有兩個相關的表:my_entities和custom_entities。
my_entities表有id、custom_entity_id等列。
在我的Groovy代碼中,兩者都是用Entity類來處理的:
@Entity
class MyEntity {
@ManyToOne(fetch = EAGER)
@JoinColumn(name = "custom_entity_id" )
CustomEntity customEntity
[...]
}
并且
class CustomEntity {
@Id
@GeneratedValue( generator = "pooled")
@GenericGenerator(name = "pooled", strategy = "org.hibernate.id.enhanced.TableGenerator", parameters = [
@Parameter(name = "value_column_name", value = "sequence_next_hi_value") 。
@Parameter(name = "prefer_entity_table_as_segment_value", value = "true") 。
@Parameter(name = "optimizer", value = "pooled") 。
@Parameter(name = "increment_size", value = "100") 。
@Parameter(name = "initial_value", value = "100")】)
長的id
[...]
}
我有一個JPA倉庫MyEntityRepository類,用于查詢my_entity表:
@Repository
interface MyEntityRepository extends JpaRepository<MyEntity, Long> {
[...]
}
在MyEntityRepository中,我試圖實作一個findByCustomEntityIds()方法,像這樣:
@Query(""/span>"
選擇e
from MyEntity e
where e.delete = false
and e.customEntity in :ids
""")
List<TestCollectionQuery> findByCustomEntityIds(@Param("ids") List< Long> ids)
在MySQL中,查詢是相當簡單的(比如說id為2400),顯然不需要連接:
SELECT t。 * FROM my_entities t WHERE custom_entity_id in (2400)。
除了自動將下劃線翻譯成駱駝字母外,SQL表列名中的尾部_id也被剝離,否則,代碼無法編譯。
我還有一個自定義的Groovy類,它呼叫了該方法:
我有一個自定義的Groovy類。
class MyClass {
@Autowired
MyEntityRepository myEntityRepository
List<MyEntity> getEntities(List<Long> customEntityIds) {
return myEntityRepository.findByCustomEntityIds(customEntityIds)。
}
該呼叫引發了以下例外:
org.springframework.dao.InvalidDataAccessApiUsageException。Parameter value element [2400] did not match expected type [... CustomEntity (n/a)];嵌套例外是 java.lang.IllegalArgumentException。Parameter value element [2400] did not match expected type [...CustomEntity (n/a)]/span>
[...]
Caused by: java.lang.IllegalArgumentException: Parameter value element [2400] did not match expected type [ . .CustomEntity (n/a)]
從錯誤資訊中,我了解到輸入應該是一個CustomEntity物件的串列,而不是ID(Long)。
一個潛在的解決方法似乎是查詢custom_entities表,以便將自定義物體ID從Long轉換成CustomEntity物件。
然而,這將需要添加一個JPA CustomEntityRepository,而且似乎非常低效。這將需要額外的資料庫呼叫,只是為了將 ID 轉換成物件,以便我最終能夠在 my_entities 表中查詢 ID(我已經有了)。
我之所以擁有自定義物體的 ID,而不是物件,是因為它們是由用戶的輸入進一步提供的。
我的問題是:我如何在MyEntityRepository中實作一個方法,根據自定義物體ID的串列實作上述的MySQL查詢,而不把它們從Long轉換為CustomEntity物件?
或者我的設計中存在一個更基本的缺陷?
uj5u.com熱心網友回復:
查詢應該以"and e.customEntity.id in :ids"結束,而不是以"and e.customEntity in :ids"。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/306811.html
標籤:
上一篇:MySQL查詢顯示類似0x8081的東西,而不是特殊字符
下一篇:多列的SQLMAX并檢索每一行
