【发布时间】:2012-05-17 00:23:34
【问题描述】:
我想在 HQL 中在我的“where”子句中使用抽象方法的结果。这可以做到吗?
类似这样的:
@NamedQuery(name="getMailRelations", query="Select mr from MailRelation mr where mr.getOccurrences() > 5"
我有一个类似这样的映射超类
@Entity
@Table(name="Mail_Entity", schema="relations")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="relationType", discriminatorType=DiscriminatorType.STRING)
@PersistenceContext(name="domas")
public abstract class MailRelation {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;
@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST})
@JoinColumn(name="mailId", referencedColumnName="mailId", nullable=false)
private Mail mail;
public void setMail(Mail mail) {
this.mail = mail;
if(!mail.getMailRelations().contains(this))
mail.addMailRelation(this);
}
public abstract int getOccurrences();
public Mail getMail() {
return mail;
// and more code......
【问题讨论】:
-
AFAIK 我们不能在 HQL 中使用 java 方法
-
你能解释一下getOccurrences方法是做什么的吗?
-
@Gamb 它只是一个示例,在这种情况下它可以返回一个数字。我不相信这个案子的意义重大,但我可能是错的?
-
我想你可以参数化你的 NamedQuery,如果在进行查询之前可以知道出现次数,或者如果出现次数可以转换为类的属性,那么你可以直接使用它。此外,如果事件与 MailRelations 本身有关(例如在数据库中保留了多少),问题就会出现另一个转折。
-
@Gamb 在我的真实案例中,它是一个独特的哈希,不能总是预先计算。不过我喜欢这个想法!
标签: java hibernate jakarta-ee hql