【问题标题】:JPQL/HQL queries using an associative table使用关联表的 JPQL/HQL 查询
【发布时间】:2017-04-21 02:23:32
【问题描述】:

我有用户和任务。每个用户可以有多组任务,反之亦然。我将包含在任务“成员”中的用户称为“成员”,但我没有成员实体,它是隐式的,并通过注释 @JoinTable(name = "member"... 声明。代码:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    private int id;

    @ManyToMany
    @JoinTable(name = "member", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "task_id"))
    private Set<Task> tasks = new HashSet<>();
}

@Entity
public class Task {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    private int id;

    @ManyToMany(mappedBy = "tasks")
    private Set<User> users = new HashSet<>();

    private Calendar initialDate;
    private Calendar finalDate;
}

我的问题出在 JPQL 查询中,因为我没有 Member 真正的 bean(@Entity 注释和东西)我不能在我的存储库上做任何事情(假设我有和 Member 实体映射一个用户和一个任务) :

FROM User u
WHERE NOT EXISTS
(
 FROM Member m WHERE m.task.finalDate >= :inicial AND m.task.finalDate <= :final
 AND m.user.id = u.id//Member here is a hipotetical/nonexistent entity 
)

有什么方法可以使用 JPQL/HQL 进行此查询,否则我需要回退到本机 sql 查询? 类型

【问题讨论】:

  • 显然 JPQL 语句以“SELECT {alias}”开头 ...
  • 从未在 HQL 查询上使用过 select,它会解决我的任何问题吗?
  • 这意味着您的查询是有效的 JPQL,即标准投诉 JPA。没有它,它们在任何地方都没有用,除了 Hibernate ...
  • 啊,明白了。但在这种情况下,我创建了一个假设的 JPQL 查询,因为我没有成员类(@Entity)......并且 Idk 如何在没有这个关联类的情况下编写这个查询。

标签: hibernate jpa hql spring-data-jpa jpql


【解决方案1】:

我认为对于提供的示例,您不需要引用成员实体(如果存在)。您可能可以执行以下操作:

from User u INNER JOIN u.tasks t WHERE t.finalData < :initial OR t.finalDate > :final

【讨论】:

  • 成员只有一个伪造的实体,它在我的项目中确实不存在,但如果它存在那将是 JPQ 查询。 Ty,我会试试你的解释。
猜你喜欢
  • 1970-01-01
  • 2014-09-28
  • 2018-09-04
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多