【问题标题】:In a JPA sql query, HIbernate can't resolve the foreignKey column在 JPA sql 查询中,HIbernate 无法解析 foreignKey 列
【发布时间】:2019-07-10 01:14:50
【问题描述】:

我有一个 springboot 项目(v2.0.2.RELEASE)。 我有两个实体AlimentFreezerAliment.freezer_id 是指向 Freezer.Id 的外键。

在我的食物CrudRepository 中,我使用@Query 编写JPA sql 的方法:

@Query("select distinct al from Aliment al WHERE al.freezer_id = :freezerId")
Set<Aliment> findFreezerContent(@Param("freezerId")Long freezerId);

我收到以下错误,看起来很清楚

原因:java.lang.IllegalArgumentException:org.hibernate.QueryException:无法解析属性:freezer_id of:我的查询

我通过注释将列名明确设置为freezer_id @JoinColumn(name="freezer_id", referencedColumnName="id")

我使用 postgresql,我在 pg_admin 中看到该列是由 hibernate 创建的。

部分代码如下:

Aliment.java

@Entity
public class Aliment extends EntityRoot {
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="freezer_ida", referencedColumnName="id")
    private Freezer freezer;



    @Column(name="name")
    private String name;

    @Column(name="category")
    private String category;

    @Column(name="iconic_font_name")
    private String iconicFontName;

    @Column(name="quantity")
    private Double quantity;

    @Column(name="quantity_unit")
    private String quantityUnit;

    @Column(name="stored_date")
    private Date storedDate;

    @Column(name="expiration_date")
    private Date expirationDate;
 
    //other methods
}

Freezer.java

@Entity
public class Freezer extends EntityRoot {


    @OneToMany(mappedBy = "freezer", cascade= CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    private Set<Aliment> content;



    @Column(name="name")
    private String name;

    //other methods
}

AlimentRepository.java

public interface AlimentRepository extends CrudRepository<Aliment, Long> {

    @Query("select distinct al from Aliment al WHERE al.freezer_id = :freezerId")
    Set<Aliment> findFreezerContent(@Param("freezerId")Long freezerId);
}

EntityRoot.java

@MappedSuperclass  
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class EntityRoot {
    @Id @GeneratedValue @Column(name="id")
    protected Long id;
    
    @Generated(value = GenerationTime.INSERT)
    @Temporal(value=TemporalType.TIMESTAMP)
    @Column(name="creation_timestamp", insertable=false)
    protected Date creationTimestamp;

    @Generated(value = GenerationTime.ALWAYS)
    @Temporal(value=TemporalType.TIMESTAMP)
    @Column(name="update_timestamp")
    protected Date updateTimestamp;

    //other methods
}

我的目标是不使用join。 有可能吗?

【问题讨论】:

  • 把所有的属性都加进去会更好
  • 我也添加了所有的属性和超类; )

标签: java spring hibernate spring-boot spring-data-jpa


【解决方案1】:

您的 HQL 查询存在问题。

您不能在 HQL 查询中映射 SQL 列名称 freezer_id

需要按属性名编写HQL查询。

请将查询改为:

@Query("select distinct al from Aliment al WHERE al.freezer.id = :freezerId")

【讨论】:

  • 另请参阅,如果您指定它,您可以使用本机查询:baeldung.com/spring-data-jpa-query
  • 我们可以指定原生SQL查询。但是您不能在 HQL 查询中混淆 SQL 语法或列名。
猜你喜欢
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 2022-11-25
  • 2019-01-29
  • 2015-05-23
  • 2021-09-26
  • 2012-08-22
  • 1970-01-01
相关资源
最近更新 更多