JPA Query的小麻烦

时间:2012-02-18 14:28:58

标签: java jpa

我在一小时后遇到了一个问题。请把我当作初学者。

查询非常简单:

public List<String> finArticleByfamille(String famille){
EntityManager em = getEntityManager();
Query qr= em.createQuery("SELECT a.libel FROM Article a WHERE a.famille_idfamille =   '"+famille+"'");

return qr.getResultList();
}

我也试过这个:

public List<String> finArticleByfamille(String famille){
EntityManager em = getEntityManager();
Query qr= em.createQuery("SELECT a.libel FROM Article a WHERE a.familleIdfamille =    '"+famille+"'");

return qr.getResultList();
}

&#34; famille_idfamille&#34;表格中的外键是&#34; Famille&#34;,请参见屏幕截图:

enter image description here

错误来自此次电话:

String famille=famille_produit_fact_direct.getSelectedItem().toString();
l_article=(Vector) ajc.finArticleByfamille(famille);

我收到此错误:

Grave: null
java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: An     exception occurred while creating a query in EntityManager: 
Exception Description: Error compiling the query [SELECT a.libel FROM Article a WHERE    a.famille_idfamille = 'famille2'], line 1, column 38: unknown state or association field   [famille_idfamille] of class [glob.entitys.Article].
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:252)
at java.util.concurrent.FutureTask.get(FutureTask.java:111)
at javax.swing.SwingWorker.get(SwingWorker.java:602)
at glob.main$32.done(main.java:2068)
at javax.swing.SwingWorker$5.run(SwingWorker.java:737)

我尊重与数据库相同的名称,为什么它不起作用? (对不起法语)

3 个答案:

答案 0 :(得分:0)

听起来您的glob.entitys.Article缺少您要引用的famille_idfamille字段。查询在概念上是针对Java对象的,而不是直接针对数据库的。

根据您的数据库,缺少的字段应该类似于:

@Basic
String famille_idfamille;

虽然名字暗示它可能是外键?在这种情况下,将其映射为String可能不合适。这可能会在以后看到。

答案 1 :(得分:0)

@Tim Gage谢谢你,我刚注意到了什么...... 在我的实体glob.entitys.Article中,我将familleIdfamille作为字段:

 @JoinColumn(name = "FAMILLE_IDFAMILLE", referencedColumnName = "IDFAMILLE", nullable = false)
 @ManyToOne(optional = false)
 private Famille familleIdfamille;

Famille它是另一个实体.. 那么他不知道famille_idfamille是正常的吗?

修改

此评论来自文档:

  • 查询字符串是指Employee实体,而不是表 数据库员工......

然后我把它放了:

Query qr= em.createQuery("SELECT a.libel FROM Article a WHERE  a.familleIdfamille.idfamille = '"+famille+"'");

及其工作; 它不合理是合乎逻辑的,因为familleIdfamilleFamille实体的实例......

答案 2 :(得分:0)

我更喜欢使用:

em.createNamedQuery(namedQuery);

如果您在实体类中使用了namedQuery。

或者,如果您希望更具体的查询,可以使用您的数据库引擎本机sintax创建本机查询

em.createNativeQuery(Query);