首页 > 解决方案 > 如何正确编写 hql 查询以获取数据?我一直遇到错误

问题描述

我尝试编写一个 hql 查询以通过 teamSeasonId 和 userId 获取 BaseballLineup 对象,但我不断收到 StackOverflow 错误。首先,当我一起编写查询时,我得到了 MultipleBagfetchError,然后我得到了lazyfetchexemption,现在我有 StackOverflow 错误。如何正确编写查询?

@Entity
@Table(name = "baseball_lineup", schema = "apbago", catalog = "apbago")
public class BaseballLineup {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Basic
    @Column(name = "lineup_name")
    private String lineupName;
 
    @OneToMany(mappedBy = "lineup", cascade = CascadeType.REMOVE)
    private List<BaseballLineupPlayerStatus> lineupPlayerStatuses;

    @ManyToOne
    @JoinColumn(name = "lineup_type", referencedColumnName = "id", nullable = false)
    private BaseballLineupType lineupType;

    @OneToMany(mappedBy = "lineup", cascade = CascadeType.REMOVE)
    private List<BaseballLineupEntry> lineupEntries;

    @ManyToOne
    @JoinColumn(name = "owner_user_id", referencedColumnName = "id", nullable = true)
    private User owner;

    @ManyToOne
    @JoinColumn(name = "team_season_id", referencedColumnName = "id", nullable = false)
    private TeamSeason teamSeason;
}

@Entity
@Table(name = "baseball_lineup_player_status", schema = "apbago", catalog = "apbago")
public class BaseballLineupPlayerStatus {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @ManyToOne
    @JoinColumn(name = "lineup_id", referencedColumnName = "id", nullable = false)
    private BaseballLineup lineup;
    @Basic
    @Column(name = "benched")
    private Boolean benched;
    @ManyToOne
    @JoinColumn(name = "player_season_id", referencedColumnName = "id", nullable = false)
    private BaseballPlayerSeason playerSeason; 
}

@Entity
@Table(name = "baseball_lineup_entry", schema = "apbago", catalog = "apbago")
public class BaseballLineupEntry {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @Basic
    @Column(name = "batting_order_index")
    private Long battingOrderIndex;
    @ManyToOne
    @JoinColumn(name = "lineup_id", referencedColumnName = "id", nullable = false)
    private BaseballLineup lineup;
    @ManyToOne
    @JoinColumn(name = "defensive_position_id", referencedColumnName = "id", nullable = false)
    private BaseballLineupDefensivePosition defensivePosition;
    @ManyToOne
    @JoinColumn(name = "player_season_id", referencedColumnName = "id", nullable = false)
    private BaseballPlayerSeason playerSeason;
}


@Override
    public List<BaseballLineup> findAllLineupsForUserIncludingDefaults(Long teamSeasonId, Long userId, boolean limit) {
        System.out.println("code reach 62 herhe");
        Query query = sessionFactory.getCurrentSession()
                .createQuery("select distinct l from BaseballLineup l " 
                        + " inner join fetch l.lineupType lt "
                        + " inner join fetch l.teamSeason ts " 
                        + " inner join fetch l.lineupEntries le "
                        + " inner join fetch le.defensivePosition def " 
                        + " inner join fetch le.playerSeason pes "
                        + " left join fetch l.owner o " 
                        + " where ts.id = :teamSeasonId "
                        + " and ts.active = true "
                        + " and pes.active = true "
                        + " and (o is null or o.id = :userId) "
                        + " order by l.id")
                .setLong("userId", userId)
                .setLong("teamSeasonId", teamSeasonId);
        query.list();
        System.out.println("code reach 79 herhe");
        query = sessionFactory.getCurrentSession()
                .createQuery("select distinct l from BaseballLineup l " 
                        + " inner join fetch l.lineupType lt "
                        + " inner join fetch l.teamSeason ts "      
                        + " left join fetch l.lineupPlayerStatuses lp "
                        + " left join fetch lp.playerSeason pls "                   
                        + " left join fetch l.owner o " 
                        + " where ts.id = :teamSeasonId "
                        + " and ts.active = true "  
                        + " and pls.active = true "
                        + " and (o is null or o.id = :userId) "
                        + " order by l.id")
                .setLong("userId", userId)
                .setLong("teamSeasonId", teamSeasonId);
        query.list();
        if (limit) {
            query.setMaxResults(LINEUP_UNLOCK_LIMIT);
        }
        return query.list();
    }

标签: javahibernatehql

解决方案


推荐阅读