1

データを取得するためのいくつかの名前付きクエリを含む pojo があります。

@NamedQueries({
   @NamedQuery(name="abc", query="test")
})
@Entity
@Table(name = "MY_TABLE")
public class MyTable implements java.io.Serializable{
    private long id;
    private String name;
     ...........

サービス層メソッド内からこの名前付きクエリの結果にアクセスする必要があります。そこで、休止状態のセッション ファクトリをサービス レイヤー クラスに自動接続しようとしました。

@Service
public class MyServiceClass{ 
    @Autowired
    SessionFactory sessionFactory;
    ..........
    public void myMethod() {
       Session session = acceSessionFactory.getCurrentSession();
       Query query = session.getNamedQuery("abc").setInteger("id", 1).setString("name", "testname");
       MyTable mytablerow = (MyTable) query.uniqueResult();
          .......
    }

ただし、上記のアプローチでは、サービスレイヤーにdaoレイヤーロジックがあると思います。これは、名前付きクエリにアクセスする正しい方法ですか?

注: 上記の MyTable クラスの DAO インターフェイスまたはクラスはありません。

4

2 に答える 2

0

あなたのアプローチでは、実際にはDAOレイヤーがありません。
DAO を使用したサービス層の一般的なアプローチは次のようになります。

@NamedQueries({
   @NamedQuery(name="abc", query="test")
})
@Entity
@Table(name = "MY_TABLE")
public class MyTable


 @Repository
 public class MyTableDAOImpl implements MyTableDAO

    @Autowire
    protected SessionFactory sessionFactory;
    public MyTable myMethod1() {
        Query query = session.getNamedQuery("abc")
        .setInteger("id",1).setString("name", "testname");
        return (MyTable) query.uniqueResult();}

    public MyTable myMethod2() { ...}


@Service
public class MyTableServiceImpl implements MyTableService 
   @Autowire
   protected MyTableDAO myTableDAO;


   public MyTable myMethodService() {
      //Some logic
       ...
       return  myTableDAO.myMethod1()

  }

名前付きクエリを持つ目的は、アプリケーションの起動時にコンパイルおよび検証されることです。休止状態での名前付きクエリの利点を参照してください。

GenericDAO パターンを検討することをお勧めします

于 2013-10-10T06:38:43.983 に答える
0

はい、サービスクラスにDAOレイヤーロジックがあります。より良い設計は、MyTable からデータを取得するために使用できるさまざまなメソッドを公開する MyTableDao インターフェイスを持つことです。

于 2013-10-10T06:20:30.413 に答える