当前位置: 首页 > 面试题库 >

在具有左联接多对多单向关系的用户中,在Doctrine DQL中选择count(),其中用户没有关系特定的组

关浩壤
2023-03-14
问题内容

情景:我正在尝试为不在特定组中的用户选择DQL中的count()。

User和(和)中的Group实体之间的标准ManyToMany单向关系。系统:Symfony 2.5,Doctrine
2.4。FOSUserBundle``SonataUserBundle

实体用户

PS这不是真实的代码复制。 这是不可能的,因为有几层使用不同的配置文件以不同的格式和位置扩展,所以如果发现错误的类型,这不是问题。

namespace RAZ\UserBundle\Entity;
/**
 * @ORM\Table(name="fos_user_user")
 */
class User
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var Collection
     *
     * @ORM\ManyToMany(targetEntity="Group")
     * @ORM\JoinTable(name="fos_user_user_group")
     */
    protected $groups;
}

实体组

namespace RAZ\UserBundle\Entity;
/**
 * @ORM\Table(name="fos_user_group")
 */
class Group
{
/**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
}

问题:这甚至可以在DQL中完成吗?

问题非常相似:
如何获得多对多关系中没有与DQL和Doctrine对应的链接实体的实体?区别在于我只需要检查一个特定的组。

有效的SQL(返回1423):

SELECT COUNT(*) cnt
FROM fos_user_user u
LEFT JOIN fos_user_user_group dug ON u.id = dug.user_id AND dug.group_id = 70
WHERE dug.user_id IS NULL

DQL工作不正确(返回3208):

SELECT COUNT(u)
FROM RAZUserBundle:User u
LEFT JOIN u.groups dug WITH dug.id = 70
WHERE dug IS NULL

问题是DQL生成不同的SQL:

SELECT COUNT(u.id)
FROM fos_user_user u
LEFT JOIN fos_user_user_group ug ON u.id = ug.user_id
LEFT JOIN fos_user_group g ON g.id = ug.group_id AND (g.id = 70)
WHERE g.id IS NULL

有什么建议?


问题答案:

我设法在DQL中做到的唯一方法是使用子查询:

SELECT COUNT(u)
FROM RAZUserBundle:User u
WHERE u.id NOT IN (
    SELECT u2.id
    FROM RAZUserBundle:User u2
    JOIN u2.groups g WITH g.id = 70
)


 类似资料:
  • 是否可以与用户建立多对多关系?我试图制作一个简单的实体 但是当我从列表中选择用户并选择Save时,它给出了错误 org.springframework.dao.InvalidDataAccessApiUsageExc的:org.hibernate.瞬态对象异常:对象引用未保存的瞬态实例-保存瞬态实例前冲洗:com.mycompany.myapp.domain.用户;嵌套异常java.lang.Il

  • 我们在 Users 表中添加一个 TenantId 字段,但是没有在 UserRow 中定义,并且也不能在用户对话框中看到该字段。 该字段只能被 admin 用户查看和编辑。即使是授予了访问管理租户权限的其他用户也不能查看或者修改这些信息。 首先把 TenantId 字段添加到 UserRow.cs: namespace MultiTenancy.Administration.Entities {

  • 我的实体: 这就是我的问题,实际上很少有。 问题1: 我删除了一个Cat对象,设置了cascade类型。所有在Cat中拥有的列表中,因此当我删除Cat对象时,UC中带有Cat的所有记录都将被删除,但我得到“已删除的对象将通过级联重新保存”,这是因为我在UC中与用户有另一个关系,用户将UC存储在列表中。当我从UC中删除Cat对象和记录时,我不想删除用户对象,因此在UC中的@ManyToOne上设置c

  • 问题内容: 假设我与用户和项目之间存在多对多关系:一个用户可能属于多个项目,而一个项目可能具有多个用户。此关系在表中编码: 这是我的问题:给定一组用户(user1,user2,…),我想选择给定用户集为其所有用户的子集的所有项目。 例如,如果我在下面插入数据,然后询问用户1和2的所有项目,则查询应仅返回项目1。 (如果最好的解决方案恰巧是非标准的,那么我使用的是PostgreSQL。) 编辑: 为

  • 问题内容: 有三个表:,并且,医院能提供的医疗服务和语言服务。因此,存在两个多对多关系。 简单ERD 现在,我想使用和搜索医院数据。 DaoImpl: 而且,如果我想从三个表中按邮政编码,医疗类型和语言进行搜索,那么如何编写一个jsql。 警告: 错误:org.hibernate.hql.internal.ast.ErrorCounter- 预期加入的路径!希望加入的路径!在org.hiberna

  • 问题内容: 我的实体中存在双向多对多关系。请参阅以下示例: 当我尝试将其序列化为JSON时,出现以下异常: “ java.lang.IllegalArgumentException:无法处理托管/反向引用’COLLABORATION_TAG’:反向引用类型(java.util.Set)与托管类型(foo.Collaboration)不兼容。 实际上,我知道这很有意义,因为javadoc明确声明您不