HQL在同一个类中进行多对多查询

时间:2013-10-27 11:42:01

标签: java many-to-many hql

我有一个包含两个表,Account和Favorites的数据库。收藏夹是一个多对多表。它持有:

listowner (foreign key referencing the Account primary key)
favorite (also a foreign key referencing the Account primary key)

收藏夹在我的程序中没有自己的类。我只有Account.java,它有两套。

private Set<Account> favorites;
private Set<Account> listOwner;
//the getters and setters for these sets

相关的映射文件:

<set name="favorites" table="favorites" inverse="true" cascade="all">
        <key column="listowner" />
        <many-to-many column="favorite"  class="Models.Account" />
 </set>

<set name="listOwner" table="favorites" cascade="all">
        <key column="favorite" />
        <many-to-many column="listowner" class="Models.Account" />
</set>

现在,保存到数据库工作正常。我可以使用列表所有者保存喜欢的帐户,并在直接访问数据库时看到他出现。但我无法再从数据库中获取此信息。我想要一个帐户的所有收藏列表。在SQL中,这将是:

SELECT favorite 
FROM favorites 
WHERE listowner = "Bob"

我目前的尝试:

 public static List<Account> getFavorites(Account account)
{
    List<Account> list = null;
    Transaction tx = null;

    try
    {
        tx = session.beginTransaction();
        list = session.createQuery("from Account a where a.listOwner.accountName = :name").setParameter("name", account.getAccountName()).list();
        tx.commit();
    } catch (Exception e)
    {
        if (tx != null)
        {
            tx.rollback();
        }
        System.out.println("getFavorites failed");
        e.printStackTrace();
    } finally
    {
        return list;
    }
}

根据调试器的说法,

失败了
 list = session.createQuery("from Account a where a.listOwner.accountName = :name").setParameter("name", account.getAccountName()).list();

我做错了什么?我没有任何例外。

1 个答案:

答案 0 :(得分:1)

您的查询错误。 a.listOwner的类型为Set<Account>。而Set<Account>没有任何accountName属性。为了能够对a.listOwner元素添加限制,您需要一个显式连接:

select a from Account a 
inner join a.listOwner owner
where owner.accountName = :name

那就是说,你的整个方法应该简单地用

代替
return account.getFavorites();