我有一个弹簧启动项目( v2.0.2.RELEASE )。我有两个实体Aliment和Freezer。Aliment.freezer_id是Freezer.Id的外键。
在我的别名CrudRepository中,我在方法上使用@Query来编写JPA:
@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: my query引起
我解释地通过注释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。有可能吗?
发布于 2019-07-09 17:14:50
HQL查询中有一个问题。
您无法在HQL查询中映射SQL列名freezer_id。
您需要用属性名编写HQL查询。
请将查询更改为:
@Query("select distinct al from Aliment al WHERE al.freezer.id = :freezerId")
https://stackoverflow.com/questions/56956936
复制相似问题