我有一个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;
...........
我必须从服务层方法中访问此命名查询的结果。 所以我尝试将hibernate会话工厂自动装入服务层类。
@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接口或类。
答案 0 :(得分:0)
是的,您的服务类中有DAO层逻辑。更好的设计是使用MyTableDao接口,该接口公开了可用于从MyTable检索数据的各种方法。
答案 1 :(得分: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()
}
拥有命名查询的目的是在应用启动时编译和验证它们 见Advantages of Named queries in hibernate?
我建议您考虑GenericDAO pattern