【问题标题】:Many to Many and HQL多对多和 HQL
【发布时间】:2011-08-15 15:32:03
【问题描述】:

我上课了:

@Entity
@Table(name="restaurants")
public class Restaurant {
    @Id
    @GeneratedValue
    private int id;
    private String name;
    private String street;
    (...)
    @ManyToMany
    @JoinTable(name="user_restaurant_owner",
            joinColumns={@JoinColumn(name="restaurant_id")},
            inverseJoinColumns={@JoinColumn(name="username")})
    private List<User> owner;

如果我知道用户(“所有者”)用户名,如何获得餐厅?

Query q = session.createQuery("from Restaurant as r where r.owner = :username").setString("username", username);

它不起作用;不起作用

【问题讨论】:

    标签: sql hibernate hql


    【解决方案1】:

    如果您选择集合中元素的属性,则需要加入 HQL 中的集合。

    from Restaurant r join r.owner o where o.username = :username
    

    【讨论】:

    • 我认为这也会返回所有者的详细信息。根据我的经验,您不需要加入,您可以链接属性r.owner.username = ...,在这种情况下,只应返回餐厅详细信息。
    • 这是一个显式连接,而不是隐式连接。根据我的经验(一年多前),在尝试基于关联实体的属性进行查询时,如果没有显式连接,我会遇到麻烦。在任何情况下,它都应该返回 Restaurant 实体,并且应该填充 Restaurant 的所有者列表,因为它没有被标记为惰性。您可以将其更改为从 Restaurant r join r.owner o where o.username = :username 中选择 r。这是加入 docs.jboss.org/hibernate/core/3.3/reference/en/html/… 的文档
    • 关于Fetch.EAGER 的观点很好,关于显式连接和隐式连接你是对的。但是,对于这种情况,简单地链接属性将提供更简单的查询。
    • 我同意你对属性有意见。我所知道的是,根据我的经验(同样,一年多没有接触 HQL)如果我没有进行显式连接,我会遇到问题。也许他们从那以后就修好了。
    • 似乎提问者已经失去了兴趣,或者懒得投票给任何答案。 +1 对我的回答 :-)
    【解决方案2】:

    from Restaurant as r 应该是 from Restaurant r 不是 as(不确定 as 是否是可选的)。 另外,你做r.owner = ...这应该是r.owner.username = :username

    【讨论】:

      【解决方案3】:

      r.owner 引用 Owners 表的 PRIMARY KEY。

      你想要的是一个子选择(为了简单起见,这里在 SQL 中完成 - 我对 HQL 不太自信):

      select {r.*} from Restaurant as r where r.owner = ( select id from Owners as own where own = :username ).setString("username", username)
      

      这样,您将外键与其引用的字段匹配,而不是名称字段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        • 2011-08-21
        • 2012-03-13
        • 2016-09-01
        相关资源
        最近更新 更多