open jpa 集合查询的问题

qybao 2009-04-09 10:04:45
比如有2个entity
class A {
private List<B> bs;
}

Class B {

}
即A表有个子表B
用JQL查询时,如何把满足条件的A,B同时返回
如果是
select a, b from A a, In(a.bs) b where xxx
这样的话,当子表信息不存在时,jpa没法构建b对象,所以会出错
用join, left fetch join都不行
我想得到的结果当子表B的信息不存在时,b返回的是null对象
但是jpa没法把null转化为B对象,所以不行
如果是
select a, a.bs from A a, In(a.bs) b where xxx
这样的话,jpa会提示查询中不能出现集合类型的错误

当然,如果是
select a from A a, In(a.bs) b where xxx
检索出a后再调用a.getBs(),是可以的,但这时返回的B子表的信息条件就不能限制了
因为这时a.getBs将返回所有跟A关联的子表B的信息
如果我只想返回符合我想要的条件的部分子表B的信息,该怎么做
总不能让我遍历a.getBs,然后一条一条判断条件吧
有什么方法一次性用JQL就能一次取出符合条件的信息?
如果用原生SQL,又如果在结果中构建A,B对象?


...全文
404 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
nake 2009-04-25
  • 打赏
  • 举报
回复
帮顶
  • 打赏
  • 举报
回复
好复杂啊
qybao 2009-04-13
  • 打赏
  • 举报
回复
没人回答,撒分了
qybao 2009-04-13
  • 打赏
  • 举报
回复
补充一下,当时我测试的时候,以下两种方法,即使出现null也不出错
SELECT a FROM A a, In(a.bs) b WHERE a.value=XXX and b.value = BBB //光选A没问题

SELECT b FROM A a, In(a.bs) b WHERE a.value=XXX and b.value = BBB //光选B没问题

但是同时选a,b的时候就出错了,原因当时分析了一下,同时选a,b时
即SELECT a, b FROM A a, In(a.bs) b WHERE a.value=XXX and b.value = BBB
实际上JPA还是分步执行,即先选出a,然后在调用a.getB选出b,所以当没有满足A条件的a时,即a是null时,调用a.getB会出错的
当然,只是根据异常信息推测,并没有证实
qybao 2009-04-13
  • 打赏
  • 举报
回复
SELECT a FROM A a LEFT JOIN FETCH a.bs b WHERE b.xxx = xxx
不如
SELECT b FROM A a, In(a.bs) b WHERE b.xxx = xxx

因为select a这样选出来的只有a的信息,所以必须要用a.getB的方法去取B的信息,
而a.getB是一对多,只要符合外键约束的都会被取出来,所以通过这样取出来的b集合要重新判断符合查询时的B的条件b.xxx=xxx
既要在a.getB返回的集合中排除掉不是b.xxx=xxx的EntityB
但是如果是select b的话,直接把符合条件的B取出来后,因为b和a是多对一,所以用b.getA就能取出符合条件的A了

举个例子
A表
id, value
1, AAA
2, XXX
B表
id, value, AId
1, BBB, 1
2, CCC, 1
3, DDD, 1

用SELECT a FROM A a LEFT JOIN FETCH a.bs b WHERE b.value = BBB的话
a只返回1,AAA这条记录,但是通过A去取B的时候,会把B表的3条记录都取出来,而实际上B表只想去1,BBB,1这条记录

所以,用
SELECT b FROM A a, In(a.bs) b WHERE b.value = BBB的话
b只返回1,BBB,1这条记录,而且因为B跟A是多对一,所以b.getA返回的就是1,AAA这条a记录

其实我原来的本意是想A和B同时取出
即SELECT a, b FROM A a, In(a.bs) b WHERE a.value=XXX and b.value = BBB
从SQL角度上来看是没什么问题的,当没有满足条件的时候只不过返回null而已,但是JPA本身没法把null转换为Entity,,尤其b还是个集合,所以会出错



  • 打赏
  • 举报
回复
不需要啊,这样也可以根据 b 的条件来作为条件啊

SELECT a FROM A a LEFT JOIN FETCH a.bs b WHERE b.xxx = xxx
qybao 2009-04-13
  • 打赏
  • 举报
回复
LS的,光是select a或者select b都没问题的,但是同时select a, b就不行了
Entity关系是
A里有个集合属性,对应保存B
B里有个A类型属性
即EntityA和EntityB是一对多(OneToMany),方过来EntityB和EntityA是多对一(ManyToOne)
原因可能是有null出现,JAP没法把null转化为Entity对象
我现在只能select b,把符合条件的B取出,然后在循环中调用b.getA取得a了
如果是select a的话,在循环中调用a.getB的时候,还要重新判断符合B的条件
  • 打赏
  • 举报
回复
SELECT a FROM A a LEFT JOIN FETCH a.bs b WHERE ...


那两个 Entity 的映射关系是怎样的?
qybao 2009-04-10
  • 打赏
  • 举报
回复
这种问题没人遇到过吗?这样的检索应该很常见的,多个表联接查询

23,409

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧