Java QueryDSL-删除多个关联
为了找出一种更好的方法从多对多关联的列表中删除元素,我花了一天的时间 例如:Java QueryDSL-删除多个关联,java,hibernate,jpa,jpa-2.0,querydsl,Java,Hibernate,Jpa,Jpa 2.0,Querydsl,为了找出一种更好的方法从多对多关联的列表中删除元素,我花了一天的时间 例如: @Entity public class A { private Long id; @ManyToMany @JoinTable private List<B> b; } @Entity public class B { private Long id; } /* * This works. */ public boolean removeB(long aId,
@Entity
public class A {
private Long id;
@ManyToMany
@JoinTable
private List<B> b;
}
@Entity
public class B {
private Long id;
}
/*
* This works.
*/
public boolean removeB(long aId, long bId)
{
A a = getRepository().findOne(aId);
for (B b : a.b) {
if(b.id.equals(bId))
{
return a.b.remove(b);
}
}
return false;
}
/*
* This fails: "You can't specify target table 'a' for update in FROM clause"
*/
public boolean removeB(long aId, long bId)
{
QA qa = QA.a;
return getQueryFactory()
.delete(qa)
.where(qa.id.eq(aId).and(qa.b.any().id.eq(bId)))
.execute() > 0;
}
@实体
公共A类{
私人长id;
@许多
@可接合
私人名单b;
}
@实体
公共B级{
私人长id;
}
/*
*这很有效。
*/
公共布尔删除B(长期援助、长期投标)
{
A=getRepository().findOne(aId);
(B:a.B){
如果(b.id.equals(bId))
{
返回a.b.删除(b);
}
}
返回false;
}
/*
*此操作失败:“无法在FROM子句中为更新指定目标表“a”
*/
公共布尔删除B(长期援助、长期投标)
{
QA=QA.a;
返回getQueryFactory()
.删除(qa)
其中(qa.id.eq(辅助)和(qa.b.any().id.eq(投标)))
.execute()>0;
}
第一种方法removeB可以工作,但是它使用一种普通的方法来删除关联,这会导致太多的处理
我想用QueryDSL
谢谢大家!