【问题标题】:Question about JPQL, @NamedQuery关于 JPQL 的问题,@NamedQuery
【发布时间】:2011-03-09 06:58:12
【问题描述】:

如果我有这样的事情

@Entity
public class Facility {
    ...
    @ManyToOne
    @JoinColumn(name="CUSTOMER_FK")
    private Customer customer;
    ...
}

我的@NameQuery 喜欢这样吗

@NamedQuery(name="Facility.findByCustomerId", query="select c from Facility c where c.customer=:customer_fk")

或者像这样

@NamedQuery(name="Facility.findByCustomerId", query="select c from Facility c where c.CUSTOMER_FK=:customer_fk")

【问题讨论】:

    标签: java jpa jakarta-ee jpql


    【解决方案1】:

    在使用 JPQL 时,您需要停止思考外键并开始思考对象。让我们仔细看看:

    select c from Facility c where c.CUSTOMER_FK=:customer_fk
    

    您的Facility 是否有CUSTOMER_FK 属性?不,所以上面的查询是不正确的。下一个:

    select c from Facility c where c.customer=:customer_fk
    

    从语法上讲,这个是正确的。但你仍然没有思考对象。在这里,查询希望您传递客户实例,而不是 FK。因此我会像这样重写它(它相同的查询,但它更好地传达了 IMO 的意图,我实际上会避免任何 foo_fk 约定,你并没有真正使用 JPA 操作 FK ):

    select c from Facility c where c.customer = :customer
    

    如果你真的想通过 id 查找,你应该浏览关联并写:

    select c from Facility c where c.customer.id = :id
    

    【讨论】:

    • 看了你的帖子后更明白了。 TYVM
    • 我希望我能再问一个问题。如果我这样做select c from Facility c where c.customer.id = '1'"。然后我得到了我想要的。但是如果我这样做select c from Facility c where c.customer.id = :id,那么在我的 Enterprise Bean 中。我做Query query.setParameter("id", "1") 然后我什么也得不到。知道为什么吗?
    • @Harry id的类型是什么?
    • 输入Long。我尝试转换Long.parseLong("1"),但还是不行
    • 是的,它有效。我尝试了这个,它也可以工作,query.setParameter("id", new Long("1"))。非常感谢人:)
    【解决方案2】:

    在 JPQL 中,您使用属性的名称,而不是数据库列。所以 - 第一个选项。

    但是当你传递参数时,传递的是整个对象,而不是它们的 ID。在您的情况下,您要么传递一个 Customer 实例,要么让 where 子句查找 c.customer.id(最好将别名命名为 f,而不是 c

    【讨论】:

    • 当我尝试这样做时@NamedQuery(name="Facility.findByCustomerId", query="select c from Facility c where c.customer = '1'")。我什么也没有回来。我是不是做错了什么?
    猜你喜欢
    • 1970-01-01
    • 2012-08-21
    • 2016-10-07
    • 2019-08-13
    • 2014-07-23
    • 2016-09-11
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多