В SQL-запросе JPA HIbernate не может разрешить столбец foreignKey - PullRequest
1 голос
/ 09 июля 2019

У меня есть проект весенней загрузки (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 из: мой запрос

Я явно устанавливаю имя столбца равным 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.Возможно ли это?

1 Ответ

3 голосов
/ 09 июля 2019

В вашем HQL-запросе есть проблема.

вы не можете отобразить имя столбца SQL freezer_id в вашем HQL-запросе.

Вам нужно написать HQL-запрос по имени атрибута.

Пожалуйста, измените запрос на:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...