2012-03-06 71 views
0

我哈瓦两个表具有多对多关系:Apache OpenJPA开发 - NamedQuery异常

@Entity(name = "arelation") 
@NamedQueries({ @NamedQuery(name = "arelation.findAByName", query = "SELECT a FROM arelation a WHERE a.arelationname = :aname"), 
    @NamedQuery(name = "arelation.findA", query = "SELECT a FROM arelation a WHERE a.arelationname = :aname and a.bList = :bList") 
}) 
public class ABean{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 
    @NotNull 
    private String arelationname; 

    @ManyToMany(targetEntity = BBean.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @JoinTable(name = "joinAB", joinColumns = { @JoinColumn(name = "aID") }, inverseJoinColumns = { @JoinColumn(name = "bID") }) 
    private List<BBean> bList= new ArrayList<BBean>(); 

     ....... 
} 

@Entity(name = "brelation") 
@NamedQueries({ @NamedQuery(name = "brelation.findB", query = "SELECT b FROM brelation b WHERE b.brelationname = :bname)}) 
public class BBean{ 
    /* 
    * private Bean Variables 
    */ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 
    @NotNull 
    private String brelationname; 


    @ManyToMany(mappedBy = "bList") 
    @NotNull 
    private List<ABean> aList= new ArrayList<ABean>(); 

     ....... 
} 

不,我想找到一个ABean与NamedQuerd arelation.findA这样的:

public ABean findABean(EntityManager em, ABean a) 
     throws NoResultException { 
    return (ABean) em.createNamedQuery("arelation.findA") 
      .setParameter("aname", a.getArelationname()) 
      .setParameter("blist", a..getBList()) 
      .getSingleResult(); 
} 

我设置bList包含来自数据库的持久对象。

但是,当我想找到“ABean”我得到以下异常:

java.lang.IllegalArgumentException: Parameter "Parameter<BBean>('blist')" declared in "SELECT a FROM arelation a WHERE a.arelationname = :aname and a.bList = :bList" is set to value of "[  ArelationName: name0 
,  ArelationName: name1 
,  ArelationName: name2 
,  ArelationName: name3 
,  ArelationName: name4 
,  ArelationName: name5 
,  ArelationName: name6 
,  ArelationName: name7 
]" of type "org.apache.openjpa.util.java$util$ArrayList$proxy", but this parameter is bound to a field of type "mypackage.BBean" 

是否有人知道为什么我得到这个例外? 我只想知道,如果这个名字和这个BBeans的ABean存在于数据库中。编辑: 好吧,我知道原因: 参数应该是一个BBean而不是它的列表 但是我怎样才能使用BBeans列表?

问候 Veote

回答

1

在命名查询试图参考表时,你应该使用类名,尝试使用这个

@NamedQueries({ @NamedQuery(name = "brelation.findB", query = "SELECT b FROM BBean b WHERE b.brelationname = :bname)}) 

,第二个是,你并不需要创建新对象, 只是让它留List<BBean> aList;

希望这会帮助你。

+0

嘿,谢谢你的回答,但我不能从一个bean选择 - >我得到一个ArgumentEception:异常在线程“主” org.apache.openjpa .persistence.ArgumentException:解析查询过滤器时发生错误“SELECT a FROM ABean a WHERE a.arelationname =:aname and a.bList =:bList”。错误消息:名称“ABean”不是公认的实体或标识符。也许你的意思是arelation,这是一个接近的匹配。已知实体名称:[arelation,brelation] – veote 2012-03-07 06:40:38

+0

您在@Entity注释中将实体名称从'ABean'更改为'arelation'。 – Rick 2012-03-07 13:47:45