默认情况下,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();
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中的字段别名必须与实体类的属性名完全一致。