作者NullLife (929rock化)
看板java
标题[问题] 请问JPA如何做阶层式查询
时间Thu Jul 17 02:16:15 2014
例如有某一张Table存放一家公司底下的处部等关系,
Aa ┬ Ba ┬ Ca ┬ Da
├ Bb ├ Cb └ Db ┬ Ea ┬ Fa
│ └ Cc └ Eb ├ Fb
└ Bc ┬ Cd ┬ Dc └ Fc
│ └ Dd ┬ Ec
└ Ce ┬ De └ Ed
├ Df
└ Dg
目前table已经做出阶层式的关系,
class MyEntity {
@Id
@...
private Integer seq;
@ManyToOne
@JoinColumn(name="parent_seq")
private MyEntity parent;
@OneToMany
@JoinTable(
name="link"
,joinColumns = @JoinColumn(
name = "parent_seq"
,referencedColumnName = "seq"
)
,inverseJoinColumns = @JoinColumn(
name = "child_seq"
,referencedColumnName = "seq"
)
)
private Set<MyEntity> children;
...
}
现在写入、跟一般查询都很正常,
可以取到我要的资料,然後可以看到上下的关系
但如果处部有名字一样的时候,我想查到某个支线下的处部关系,要怎麽做?
例如如下图的 Ea 跟 Df 同时都叫"总务部"好了
Aa ┬ Ba ┬ Ca ┬ Da
├ Bb ├ Cb └ Db ┬
Ea ┬ Fa
│ └ Cc └ Eb ├ Fb
└ Bc ┬ Cd ┬ Dc └ Fc
│ └ Dd ┬ Ec
└ Ce ┬ De └ Ed
├
Df
└ Dg
然後今天我想找Ea这个部,底下还有细分那些部,
但我所拥有的条件,就只有 Aa Ba Ca Db Ea 的名字,
要怎麽做才能找到我要 Ea ?
因为如果直接条件下"总务部",我会得到两笔资料,
然後两笔要往上查看是否为我要找的支线,
要不然就变成是全查出来,然後递回去找到我要的 Ea...
这两个方法都满笨的,而且要写不少code...
小弟我这两天想破头了,也有想调整结构,或者多Table来处理,
但都一样很麻烦,省不了工...
所以上来请教一下各版大有没有其他比较方便方法能达到这个目的?
感恩<(_ _)>
--
为什麽不说话 为什麽打哈欠
今天的天气这麽好 怎麽还愁眉苦着脸
让我们喝咖啡 让我们听音乐
让我们跨越了界线 让我们自在的聊天
黄玠
让我们每天心情都是星期天
生活一堆毛
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.194.158.25
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1405534578.A.192.html
※ 编辑: NullLife (123.194.158.25), 07/17/2014 02:18:26
1F:推 LaPass:同样的问题 +1 其实这不只在java上会有这个问题..... 07/17 10:10
2F:→ LaPass:只要是资料库对上树状结构,应该都会有这个问题.... 07/17 10:10
主是要想问JPA或者有没有其他机制能做这件事情?
3F:推 yyc1217:把所有从root至leaf的路径都变成一份record可以吗? 07/17 10:19
4F:→ yyc1217:例如{Aa,Ba,Ca,Da,null,null}, {Aa,Ba,Ca,Db,Ea,Fa}, ... 07/17 10:20
5F:→ yyc1217:如果公司阶层不常变,就开固定数目的栏位就好 07/17 10:21
6F:→ yyc1217:如果常变动,就只存在一个栏位中,然後用分隔符号分开 07/17 10:22
7F:→ yyc1217:例如"Aa|Ba|Ca|Da", "Aa|Ba|Ca|Db|Ea|Fa"这样 用like搜寻 07/17 10:22
8F:→ yyc1217:不知道我有没有误解你的意思... 07/17 10:23
我举的例子量很小,实际我的运用并不是处部,大致上会像是我们电脑资料夹的样子,
而且可能会经常变更...
不过这也是一个方法,我考量一下系统状况是否适合做这件事,谢谢。
9F:→ swpoker:是讨论SQL还是讨论JAVA的爬资料结构阿 07/17 12:01
抱歉,可能没说的很清楚,
我想不太算讨论SQL耶,因为JPA都做掉大部分的事情了,
所以想请教有没有其他方法来爬这种资料结构?
※ 编辑: NullLife (125.227.157.211), 07/17/2014 12:22:20
10F:推 popcorny:其实每个用JPA久的都会遇到这个问题, JPA是个刚开始用 07/17 12:23
11F:→ popcorny:很爽,系统大了就很难掌握的架构。 07/17 12:24
12F:→ cyclone350:比较像是逻辑问题 07/17 12:25
13F:→ swpoker:要想的是~是哪里的总务部~还是无差别的总务部 07/17 13:30
14F:→ swpoker:照你的需求~应该是Ba下的总务部-Ea 07/17 13:31
15F:→ swpoker:所以应该要先去找Ba~然後再去Ba的子阶层去找到符合总务部 07/17 13:31
16F:→ swpoker:最主要还是总务部的定义为何?因为有的时候就是要上爬 07/17 13:33
17F:→ swpoker:但我习惯先去定义总务部的范围大概有哪里~在去决定实作 07/17 13:34
18F:→ swpoker:这个跟爬HTML的DOM没甚麽两样阿~ 07/17 13:35
19F:→ swpoker:不然你就在Entity里面弄几个索引阿~~这样就不用爬拉 07/17 13:37
20F:→ swpoker:在建立资料结构的时候~同时建立相对的索引 07/17 13:38
21F:→ swpoker:缺点是初始的比较耗资源~优点就是查询方便阿 07/17 13:39
22F:→ swpoker:但是资料有很多吗~不然几百笔资料递回一下很快拉 07/17 13:39
24F:→ NullLife:感谢各位大大,已有方法解决,感恩<(_ _)> 07/17 18:51
25F:推 luoqr:JPA在多个JVM上跑 不知道有没有对db lock做处理的solution? 07/18 08:49