查询语句需要:
自定义Object
支持根据动态参数组装sql语句
1.查询返回自定义Object,比如ProductWithTypeName
private Integer prodectId;
private String productName;
private Integer typeId;
private String typeName;
如果想这样 使用EntityManager的createNativeQuery方法,居然不行,ProductWithTypeName不是entity就不能。
@Override
public List<ProductWithTypeName> queryProduct(String prodectName,String typeName) {
String sql="select p.id as prodectId, p.name as productName,type.id as typeId,type.name as typeName "
+ " from product p left join product_type type on p.product_type =type.id";
//Add parameter
// Can not return Object that is not Entity.
Query query=em.createNativeQuery(sql, ProductWithTypeName.class);
//SessionFactory sessionFactory = em.unwrap(SessionFactory.class);
//sessionFactory.openSession().cre
return query.getResultList();
}
2.hibernate的session,也有createNativeQuery(sql, entity)方法,居然也不能直接就返回自定义obejct。
简直日了狗了。
3.找来找去,也有别的简化方式
public interface UserMapp {
public Integer getUserid();
public Integer getRoleid();
}
public interface UserRepository extends JpaRepository<SaasUser, Integer> {
@Query(nativeQuery = true, value ="select user_id as userid,role_id as roleid from user_role where user_id=?1")
List<UserMapp> findMiddleTable(Integer userid);
}
定义成接口,这样也能返回自定义协议结构。
想到达到本文开头说的两个需求,JPA和hibernate构建查询时居然不能用比较简单的方式实现。
多少年了,这样简单又有用的查询构建方式,JPA,hibernate都还离不开entity。即使实现,构建方式都复杂。