【发布时间】:2019-07-10 01:14:50
【问题描述】:
我有一个 springboot 项目(v2.0.2.RELEASE)。
我有两个实体Aliment 和Freezer。
Aliment.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