HQL使用完全限定类名

3

假设我有一个名为Foo的实体,如下所示 -

package com.some.company.model;
// imports
@Entity
public class Foo{
    @Id
    private Long id;    

    // getters / setters and other properties omitted   
}

当通过HQL操作实体时,我喜欢使用完全限定类名来引用实体,例如:

entityManager.createQuery(String.format("delete from %s where id = :id", Foo.class.getName()))
                .setParameter("id", fooId)
                .executeUpdate();

我注意到在 @Entity 注解中有一个属性名叫做 name,默认情况下是实体类的非限定名称。这让我想到为什么要使用非限定名称?
在 HQL 中应该使用非限定名称还是完全限定名称呢?

3个回答

4

使用完全限定名称没有意义,因为Hibernate不允许重复的实体名称。所以,如果您有不同的实体具有相同的名称,位于不同的包中。Hibernate将抛出DuplicateMappingException。


嗯..看起来Hibernate在内部处理未经限定的类名,对吧? - Premraj
它可能具有实体名称为键的 Map。 - Robby Pond
这意味着如果我指定了完全限定的类名,Hibernate 需要做额外的工作吗? - Premraj
就像我说的,我不确定它是如何工作的。只是假设它使用了一个映射表,这就是为什么实体名称不能重复的原因。但这对你来说是额外的工作。你为什么想要做完整的包+类呢? - Robby Pond

0

我认为这没有什么区别,但是... 我更喜欢使用非限定名称,因为它更短,使我的HQL更易于理解。我能想到的唯一使用完全限定名称的原因是您有两个不同的 Foo 实体(来自不同的包),在这种情况下,我更愿意将它们映射到不同的实体名称中(例如 AFooBFoo),而不是使用完全限定名称来区分它们。


Hibernate不允许重复的实体名称。 - Robby Pond

0

对于非实体类,您还必须提供包名(getName()) 如果您有多个被不同实体类扩展的类,则HQL查询无法解决问题:"from com.hello.AbstractEntity"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接