問題
在對物體和多對一映射物體的屬性(可能為空也可能不為空)運行查詢時,在映射多對一為空的記錄上不回傳任何記錄,即使主物體也是如此可能匹配搜索條件。這種行為似乎表現得像 INNER JOIN 而不是 OUTER JOIN。
CRUD 操作一切正常,唯一的問題是運行查詢時。
預期的
我希望這表現得像 LEFT OUTER JOIN,即使映射物體為空,也會回傳匹配的記錄。
當只回傳 preperty #10 時,期望類似于此的查詢回傳以下兩個屬性記錄。
SELECT Property.* FROM Property
LEFT JOIN Resident ON Resident.id = Property.Resident_id
WHERE Property.Address LIKE "%test%" OR Resident.Name LIKE "%test%"
環境
- MySQL v8
- Eclipselink v2.7.7
表
財產
| ID | 地址 | resident_id |
|---|---|---|
| 10 | 123 測驗博士 | 20 |
| 11 | 測驗街 456 號 | 無效的 |
居民
| ID | 姓名 |
|---|---|
| 10 | 約翰·多伊 |
| 11 | 詹姆斯·威廉姆斯 |
物體
財產
@Entity
@Table(name = "Property")
public class Property
{
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "Resident_id")
private Integer residentId;
@Column(name = "Address")
private String address;
@ManyToOne(optional = true, fetch = FetchType.LAZY)
@JoinColumn(name = "Resident_id", referencedColumnName = "id", updatable = false, insertable = false, nullable = true)
private Resident resident;
居民
@Entity
@Table(name = "Resident")
public class Resident
{
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "Name")
private String name;
詢問
public List<Property> search(String str)
{
List<Property> list = new ArrayList<>();
if(str == null || str.isEmpty())
return list;
try
{
String sql = "SELECT x FROM Property x WHERE "
" x.address LIKE :str OR x.resident.name LIKE :str"
" ORDER BY x.address";
Query q = this.getEntityManager().createQuery(sql);
q.setParameter("str", "%" str "%");
list.addAll(q.getResultList());
}
catch(Exception e)
{
e.printStackTrace();
}
return list;
}
uj5u.com熱心網友回復:
JPQL 要求提供者對待 '.' 路徑運算式作為內部連接,因此呼叫 x.resident.name 將從選擇中排除空居民。
你想要的更像是
String JPQL = "SELECT x FROM Property x left join x.resident resident "
"WHERE x.address LIKE :str OR resident.name LIKE :str"
" ORDER BY x.address";
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/487031.html
上一篇:HibernateSessionFactory可以在沒有第三部分快取系統(Redis、HazelCast等)的情況下作業嗎?
