Apache OpenJPA - исключение NamedQuery

У меня есть две таблицы с отношением manyToMany:

@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();
}

Я установил список с сохраненными объектами из базы данных.

Но когда я хочу найти "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"

Кто-то знает, почему я получаю это исключение? Я только хочу знать, существует ли в БД ABean с этим именем и этим BBeans.

РЕДАКТИРОВАТЬ: Хорошо, я знаю причину: параметр должен быть BBean, а не список его. Но как я могу использовать список BBeans?

С наилучшими пожеланиями Veote

1 ответ

В именованном запросе вы должны использовать имя класса при попытке обратиться к таблице, попробуйте использовать это

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

и второе - вам не нужно создавать новый объект, просто оставьте его List<BBean> aList;

Надеюсь, что это поможет вам.

Другие вопросы по тегам