我有一个包含两个表,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();
我做错了什么?我没有任何例外。
答案 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();