2

結合を使用して HQL で休止状態のクエリを実行し、その後query.list、一致したオブジェクトのリストを返すために呼び出すとquery.list().get(0).getClass() == Object.getClass()、期待されるオブジェクトのインスタンスではなく、実際のオブジェクト インスタンス (つまり ) のリストになってしまいます。

結合なしでクエリを実行すると、期待される型のオブジェクトが正しく返され、適切にキャストして使用することができます。

これまでのところ、私の検索では、これを引き起こしている可能性のあるものについて何も見つかりませんでした. オブジェクトが正しくマップされていることを確認するために、hql で結合を使用するときに他に何かする必要がありますか?

編集: 以下にコードの抜粋を追加しました。すべての名前を変更し、関連する部分のみを抽出する必要がありました (実際のコードは実際には車に関するものではありません)。

作業クエリ:

from Car car where car.name like :name

機能しないクエリ:

from Car car left join car.occupants occupant where car.name like :name OR (occupant.name like :oname)

車のエンティティ:

@Entity
@Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"someId"}), 
                            @UniqueConstraint(columnNames = {"someOtherId"})})
public class Car extends SomeParentEntity
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 64)
    private String someId;

    @Column(length = 64)
    private String name;

    // ... Many columns and mappings removed ...

    @OneToMany(mappedBy = "car", fetch = FetchType.LAZY)
    private List<Occupant> occupants;

    // ...
}

占有エンティティ:

@Entity(name = "car.Occupant")
@Table(uniqueConstraints = {@UniqueConstraint(columnNames = { "name" }) })
public class User extends SomeParentEntity
{

    @ManyToOne
    @JoinColumn(name = "carId", nullable = false)
    private Car car;

    @Column(length = 64, nullable = false)
    private String name;

        // ... Many mappings / columns removed ...
}
4

3 に答える 3

3

HQLJOINでは、Hibernate に 2 種類のオブジェクトを取得させています。これは、SQL ロギングを有効にすると確認できます。

エンティティに X 対 X の関係があると仮定すると、使用するクエリを変更すると問題は解決するはずです。

... JOIN FETCH entity.relation ...
于 2013-08-15T18:24:49.383 に答える
2

あなたの助けのために+1は他の回答者の周りにあります。それは大歓迎です。

しかし、解決策は非常に単純であることが判明しました。クエリでは、フィールドを絞り込むために、結合ケースの最初に選択を指定する必要がありました (私は思います)。

したがって、機能しないクエリは次のとおりです。

from Car car left join car.occupants occupant where car.name like :name OR (occupant.name like :oname)

なります:

select car from Car car left join car.occupants occupant where car.name like :name OR (occupant.name like :oname)
于 2013-08-15T21:21:38.007 に答える
2

なぜ明示的な左結合を使用しているのですか。

from Car car left join car.occupants occupant where car.name like :name OR (occupant.name like :oname)

簡単に使用できると思います:

from Car car where car.name like :name or car.occupant.name like :oname

次に、 query.list は、車のリストにキャストバックする必要があるオブジェクトのリストを提供する必要があります

于 2013-08-15T19:26:59.123 に答える