0

SQLエクスプローラーを使用して実行すると662行を返すクエリがあり、休止状態を使用してコードで実行すると856行が返されます...セットを使用して重複をそのように削除しようとしましたが、明らかにそうではありません重複...

クエリ:

String queryString = "FROM AEntity AS A " +
                     "LEFT JOIN A.bEntityAS B " +
                     "WHERE A.INIT||A.NUM IN (:carList) AND A.INIT IN (:initList) AND A.NUM IN (:numberList) " + 
                     "AND B.TRUK_AXL_CNT > 0";

クラス

public class BEntity implements Serializable{

    @Id
    @Column(name = "NUM")
    private String num;

    @Id
    @Column(name = "INIT")
    private String init;

    @Column(name = "V_CNT")
    private Integer vcnt;
}

public class AEntity implements Serializable{

    @Id
    @Column(name = "NUM")
    private String num;

    @Id
    @Column(name = "INIT")
    private String init;

    @OneToOne
    @PrimaryKeyJoinColumns({
        @PrimaryKeyJoinColumn(name="NUM", referencedColumnName="NUM"),
        @PrimaryKeyJoinColumn(name="INIT", referencedColumnName="INIT")
    })
    private BEntity bEntity;
}
4

3 に答える 3

0

残念ながら、他の回答はどれも機能しませんでしたが、SQLエクスプローラーが誤った結果を返している間に、何らかの理由でHibernateが正しい結果を返したと判断されました。結果セットの2文字のイニシャルはすべて、SQLエクスプローラーによって削除されました...誤った結果が得られました。

冬眠は正しかった!

于 2012-05-31T15:44:37.120 に答える
0

これ

WHERE A.INIT||A.NUM IN (:carList)

あなたが期待することをしません。

エンティティが 1 つある場合

INIT = 1, NUM = 34

および別のエンティティ

INIT = 13, NUM = 4

どちらの場合も、式A.INIT||A.NUMは に評価され134、エンティティのみを探す場合でもINIT = 1, NUM = 34、select は両方のエンティティをフェッチします。

これを機能させるには、可能な INIT または NUM 値に表示されない区切り文字を使用する必要があります。この例では「+」を区切り文字として使用し、select を次のように変更します。

WHERE A.INIT || '+' || A.NUM IN (:carList)

また、carlist の値は、同じ区切り文字で準備する必要があります。

于 2012-05-30T15:13:09.610 に答える
0

を使用できる場合はCriteria、次のようなものを試してください。

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

それ以外の場合はDISTINCT、HQL でキーワードを使用してみてください。

select distinct a from AEntity a...

この問題については、この記事の冒頭で少し説明しています。

于 2012-05-30T14:48:12.577 に答える