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()

  }

使用命名查询的目的是在应用程序启动时对其进行编译和验证请参阅Hibernate 中命名查询的优势?

我建议你会考虑GenericDAO 模式

于 2013-10-10T06:38:43.983 回答
0

是的,您的服务类中有 DAO 层逻辑。更好的设计是有一个 MyTableDao 接口,它公开各种可用于从 MyTable 检索数据的方法。

于 2013-10-10T06:20:30.413 回答