我有课:
class User{
String id;
ArrayList<UserAttribute> attributeList=new ArrayList<UserAttribute>();
}
class UserAttribute{
User user;
String value;
String key;
}
Run Code Online (Sandbox Code Playgroud)
我有与表相关的表.
表用户
column id
Run Code Online (Sandbox Code Playgroud)
table user_attribute
column user_id
column key
column value
Run Code Online (Sandbox Code Playgroud)
示例用户表内容
user_id="123"
user_id="234"
Run Code Online (Sandbox Code Playgroud)
示例user_attribute表内容
user_id="123", key="address", value="green house street"
user_id=234, key="address", value="blue house street"
user_id="123", key="phone", value="234324"
user_id="234", key="phone", value="786988"
Run Code Online (Sandbox Code Playgroud)
我想让有"绿屋街"地址的用户和(不是或)有电话"234324"
我在sql编辑器中编写sql(oracle):
select u.* from user u left join user_attribute prop on u.id=prop.user_id inner join user_attribute prop2 on prop.user_id = prop2.user_id where prop.value = 'green house street' and prop.key = 'address' and prop2.key ='phone' and prop2.value = '234324';
Run Code Online (Sandbox Code Playgroud)
我在hibernate方面尝试了很多东西:但是因为get而无法使用join
"未经考虑的令牌"
使用"on"子句时出错.
最后我写道
entityManager.createQuery(
select u from User u, u.attributeList prop, u.attributeList prop2 where prop.value = :address and prop.key = :key and prop2.key =:key2 and prop2.value = :phone and prop.user.id=u.id and prop2.user.id=u.id and prop2.user.id=prop.user.id
)..setParameter("key", "address")
.setParameter("phone", "234324")
.setParameter("key2", "phone")
.setParameter("address", "green house street").getSingleResult();
Run Code Online (Sandbox Code Playgroud)
仍然没有机会,
我努力寻找一个单一的查询解决方案,但到目前为止还无法实现.谢谢你的想法.
您需要进行两个连接,但不需要指定任何on子句,因为Hibernate知道,由于关联的映射,表是如何链接在一起的.所以以下查询应该有效:
select u from User u
inner join u.attributeList a1
inner join u.attributeList a2
where a1.value = 'green house street' and a1.key = 'address'
and a2.key ='phone' and a2.value = '234324'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9672 次 |
| 最近记录: |