3

名前付きクエリが2つあり、それぞれが異なるオブジェクトコンストラクターを使用して結果を選択することを除いて、どちらも同じロジックを持っています。

名前付きクエリ1:

SELECT DISTINCT NEW dk.NewsRoomView(n,p)
FROM NewsItem n LEFT JOIN n.placements p JOIN n.actors a

名前付きクエリ2:

SELECT DISTINCT NEW dk.NewsRoomView(n.id,n.title,SIZE(n.attachments),p.id,p.page)
FROM NewsItem n LEFT JOIN n.placements p JOIN n.actors a

NewsRoomViewクラスの構造

public class NewsRoomView{

  public NewsRoomView(NewsItem n, NewsItemPlacement p)
    Logger.getLogger(NewsRoomView.class.getName()).log(Level.INFO,"at Contsructor 1");
  }

  public NewsRoomView(Long id, String title, Integer attachments, Long pId, Integer page){
    Logger.getLogger(NewsRoomView.class.getName()).log(Level.INFO,"at Contsructor 2");
  }
}

これで、Named Query 1が実行されるたびに、「atコンストラクター1」ステートメントが正常に出力されるため、クエリは結果を返しますが、Named Query 2が実行されると、ステートメント「at Constructor 2」を出力せず、結果も返しません。

上記のコードブロックは、私が実際に持っているもののほんの一部です。実際には、2番目のコンストラクターには23個の長い引数リストがあり、NewsItemエンティティとNewsItemPlacementエンティティのさらにいくつかのフィールドを表します。

2番目のコンストラクターが結果を返すのを妨げる何が間違っているのか、コンストラクターの引数リストのサイズに制限があるのか​​どうか疑問に思いました。

前もって感謝します。

4

1 に答える 1

3

スローされる例外がないため、生成されたクエリはデータベースに対して問題なく実行されましたが、クエリは行を返しませんでした。問題はコンストラクタ式や引数の数とは何の関係もありません。

添付ファイルテーブルにエントリがあるようなNewsItemはないと思います。SIZE(n.attachments)により、添付ファイルテーブルへのIDベースの内部結合が発生するため、このような行は結果セットの一部にはなりません。生成されたSQLクエリを見ると、これはすべてはるかに明確になります。

同じ問題のある最小限の例

エンティティ

@Entity
public class EntityA {
    @GeneratedValue (strategy = GenerationType.TABLE)
    @Id public int id;
    @OneToMany(mappedBy = "a")
    public List<EntityB> bList;
     ...
}

@Entity
public class EntityB {
    @GeneratedValue (strategy = GenerationType.TABLE)
    @Id
    public int id;

    @ManyToOne
    private EntityA a;
}

データベースコンテンツ

EntityA
|ID | 
| 1 |
| 2 |

EntityB
|ID |A_ID |
| 1 |  2  |

クエリ

Query q = em.createQuery("Select SIZE(a.bList) FROM EntityA a");

MySQLを使用したEclipseLink(2.3.2)は、次のSQLクエリを生成します。

SELECT COUNT(t0.ID) FROM ENTITYB t0, ENTITYA t1 
WHERE (t0.A_ID = t1.ID) GROUP BY t1.ID

ご覧のとおり、EntityBテーブルに1つ以上のエントリがあるようなEntityAに対してのみbListのサイズを返します。

于 2012-07-11T09:57:51.290 に答える