gpt4 book ai didi

java - 同一类中的HQL多对多查询

转载 作者:太空宇宙 更新时间:2023-11-04 07:18:43 25 4
gpt4 key购买 nike

我有一个包含两个表的数据库:“帐户”和“Collection 夹”。 Collection 夹是一个多对多表。它包含:

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

Collection 夹在我的程序中没有自己的类。我只有 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>

现在,保存到数据库工作正常。我可以用列表所有者保存最喜欢的帐户,并在直接访问数据库时看到他出现。但我无法再次从数据库中获取这些信息。我想要一个帐户的所有 Collection 夹的列表。在 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();

我做错了什么?我没有遇到任何异常(exception)。

最佳答案

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

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

也就是说,您的整个方法应该简单地替换为

return account.getFavorites();

关于java - 同一类中的HQL多对多查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19617654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com