以下哪一个更好(EJB 3 JPA)
//查询
一个)。 getEntityManager()。createQuery(“select o from User o”);
//命名查询,其中findAllUser在实体级别定义
B)。 getEntityManager()createNamedQuery( “User.findAllUser”); **
//本机查询
C)。 getEntityManager()。createNativeQuery(“SELECT * FROM TBLMUSER”);
请解释一下哪种方法哪种方法更好?
//Example dynamic query
StringBuilder builder = new StringBuilder("select e from Employee e");
if (empName != null) {
builder.append(" where e.name = ?");
}
getEntityManager().createQuery(builder.toString());
本机SQL不一定比Hibernate / JPA Query更快。 Hibernate / JPA Query最终也被翻译成SQL。在某些情况下,可能会发生Hibernate / JPA不会生成最有效的语句,因此本机SQL可以更快 - 但使用本机SQL,您的应用程序会丢失从一个数据库到另一个数据库的可移植性,因此通常更好地调整Hibernate / JPA查询映射和HQL语句生成更高效的SQL语句。另一方面,本机SQL缺少Hibernate缓存 - 因此在某些情况下,本机SQL可能比Hibernate / JPA Query慢。
我没有性能,在大多数情况下,如果你加载所有列或只需要列,那么性能就无关紧要了。在数据库访问中,搜索行时会丢失时间,而不是在将数据传输到应用程序时。当您只阅读必要的列时。
命名查询与查询相同。它们的名字只是为了让它们可以重复使用+它们可以在不同的地方声明,例如。在类映射,配置文件等(所以您可以更改查询而不更改actaul代码)
原生查询只是本机查询,你必须完成JPA Queries为你做的所有事情,例如。绑定和引用值等+它们使用DBMP独立语法(在您的情况下为JPQL),因此更改数据库系统(让saq从MySQL到Postgresql或H2)将需要更少的工作,因为它不(不总是)需要重写本机查询。
对我来说,显然是前两个更好,即JPQL查询 - 第二个意味着实体管理器在加载持久性单元时将编译查询(并验证它们),而第一个只会在执行时产生错误。
您也可以在某些IDE中获得支持,它支持对象表示法(例如:select b from EntityA a left join a.entityB b
)和对象关系映射(如集合,索引等)引入的其他一些奇怪的东西。
另一方面,在JPQL的角落情况下使用原始查询(如窗口函数,如select id, partition by (group_id) from table
)