首页  编辑  

JPA + Oracle + 行值比较 select in 查询

Tags: /超级猛料/Database.数据库相关/Oracle/   Date Created:
默认情况下,JPA不支持 select * from table where (key, value) in (('key1', 'value1'), ('key2', 'value2')) 这种多个字段组合的 in 查询。
如果要查询,可以用动态SQL语句查询:

例如 在 repository 类上定义一个方法:


default List<Demo> getData(String name, List<String> tags, List<Object[]> keyValues, int age) {
    String sql = "select * from table where name = :name and tags in :tags and (key, value) in (:keyValues) and age > :age";
    String values = keyValues.stream().map(item -> "('" + item[0] + "', '" + item[1] + "')").collect(Collectors.joining(","));
    sql = sql.replace(":keyValues"), values);
    EntityManager entityManager = EntityManagerHelper.getEntityManager();
    Query query = entityManager.createNativeQuery(sql);
    query.setParameter("name", name);
    query.setParameter("tags", tags);
    qeury.setParameter("age", age);
    List<Object[]> list = query.getResultList();
    // 把list 转换为 Demo 对象
    return list;
}


@Component
public class EntityManager entityManager {
    @PersistenceContext
    public void setEntityManager(EntityManager em) {
        entityManager = em;
    }
    
    public static EntityManager getEntityManager() {
        return entityManager;
    }
}

这里的对象转换,你可以用下面的方法:
List<Map<String, Object>> result = query.unwrap(org.hibernate.query.NativeQuery.class)
.setTupleTransformer((tuple, aliases) -> {
Map<String, Object> map = new HashMap<>();
for (int i = 0; i < aliases.length; i++) {
map.put(aliases[i], tuple[i]);
}
return map;
})
.getResultList();


query.unwrap(org.hibernate.query.NativeQuery.class)
     .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List<Map<String, Object>> result = query.getResultList();
转为实体:更彻底,直接得到你想要的实体对象列表。关键点:SQL中的字段别名必须与实体类的属性名完全一致。