当前位置: 首页 > 知识库问答 >
问题:

JPA查询缺少别名和列(Hibernate)

缑兴贤
2023-03-14

我在Spring-Boot启用JPA的项目中有以下相关的JPA注释类(所有Groovy代码):

@Entity
abstract class Character {
    @Id
    String id;

    String name;

    @ElementCollection(targetClass = Episode)
    @Enumerated(EnumType.ORDINAL)
    Collection<Episode> appearsIn;
}

@Entity(name = "Human")
public class Human extends Character {
    String homePlanet;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "favorite_droid_id")
    Droid favoriteDroid;
}

public enum Episode {
    PHANTOM_MENACE,
    ATTACK_OF_THE_CLONES,
    REVENGE_OF_THE_SITH,
    A_NEW_HOPE,
    EMPIRE_STRIKES_BACK,
    RETURN_OF_THE_JEDI,
    THE_FORCE_AWAKENS
}

当我尝试执行以下JPA查询时:

def query = em.createQuery("from Human h where h.appearsIn in (:episodes)");
query.setParameter("episodes", EnumSet.of(Episode.THE_FORCE_AWAKENS));
def result = query.getResultList();

生成的SQL语句似乎没有字符表的别名或appares_in的列名:

select human0_.id as id2_0_, human0_.name as name3_0_, human0_.favorite_droid_id as favorite6_0_, human0_.home_planet as home_pla5_0_ 
from character human0_ 
cross join character_appears_in appearsin1_ 
where human0_.dtype='Human' and human0_.id=appearsin1_.character_id and (. in (?))
from Human h where h.appearsIn = :episode

生成以下SQL:

select human0_.id as id2_0_, human0_.name as name3_0_, human0_.favorite_droid_id as favorite6_0_, human0_.home_planet as home_pla5_0_ 
from character human0_ 
cross join character_appears_in appearsin1_ 
where human0_.dtype='Human' and human0_.id=appearsin1_.character_id and .=?

非常感谢任何帮助。

共有1个答案

葛玉堂
2023-03-14

您的查询是无效的-正如@Neil Stockton指出的,通过在(:episodes)中编写h.appearsin,您说的是“collection in collection”,这是没有意义的。

您应该像这样声明一个“集合成员变量”:

select distinct h
from Human h 
join h.appearsIn ai
where ai in (:episodes)

ai表示apparosin的单个元素(类似迭代器)。

 类似资料:
  • 问题内容: 我的Web应用程序中有一个管理控制台,允许管理员在数据库上执行自定义SQL SELECT查询。 在下面,该应用程序正在使用Hibernate,但是这些查询不是HQL,它们是纯SQL,因此我使用的是本机查询,如下所示: 这可以正常工作,但是它只返回数据行,没有额外的信息。我还想获取列名,因此当我将结果打印回用户时,我还可以打印标题以显示各个列。 有什么办法吗? 问题答案: 经过很长一段时

  • 问题内容: 我不是要命令。 我想创建一个与heidisql类似的应用程序,您可以在其中指定SQL查询,并在执行时返回包含代表查询结果的行和列的结果集。结果集中的列名称应与您在SQL查询中定义的所选列匹配。 在我的Python程序中(使用),我的查询仅返回行和列的结果,而不返回列的名称。在下面的例子中,列名应为,和。SQL最终将在程序外部。 我能想到的唯一方法是编写自己的SQL解析器逻辑以提取选定的

  • 问题内容: 查询,本机查询,命名查询和类型查询之间有什么区别?“独立”查询是否存在,还是只是缩写?在我看来,本机查询是用简单sql编写的查询,而命名查询与实体(hibernate映射)有关。有人可以简要解释一下吗? 问题答案: 询问 查询是指JPQL / HQL查询,其语法类似于通常用于执行DML语句(CRUD操作)的SQL。 在JPA中,您可以使用创建查询。您可以查看API以获得更多详细信息。

  • 问题内容: 我创建了一个存储过程,我想在其中添加替代的order by子句。问题是查询在“无效的列名’aantal regels’”上失败 这是我现在的查询。 希望有人可以帮助我! 问题答案: 您不能以这种方式按别名排序。 第一种选择是重复代码。注意:仅仅因为重复代码,SQL引擎就不会天真地再次执行它,而是重用了结果。 或全部使用子查询…