是否可以使用jpa从表中仅选择某些列?
我的表很大,并且不允许映射我实体中的所有列。我试图创建一个实体(注意,我的表中没有PK):
@Entity
@Table(name = "SuperCat")
@Getter
@Setter
public class Cat{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@Column(name="nameCat")
private String name;
}
然后在我的存储库中
public interface CatRepository extends
CrudRepository<Cat, Long> {
@Query(
"SELECT name FROM Cat")
Page<Cat> getAlCats(Pageable pageable);
这只是一个简单的示例,但是想法是相同的。我进行了很多搜索,找到了投影,但是您需要映射整个表,然后找到了本机查询,但仍然不适用。我知道我可以返回一个对象,另一个解决方案是对NEW使用查询并创建我自己的对象(没有@entity,如pojo)。但是有没有一种方法可以使用jpa做到这一点,以便能够使用存储库和服务,如果我创建自己的pojo,那么我将创建一个@transactional类,将查询(带有NEW)放在那里,就是这样。我不喜欢这种方法,我不认为jpa不允许您仅选择一些列,但是我没有找到合适的方法。 也许您会问,如果我这样做是什么结果: 我收到此错误:“无法使用请求的结果类型[java.lang.Long]为具有多个返回的查询创建TypedQuery” (对于新查询,我正在谈论:http://www.java2s.com/Tutorials/Java/JPA/4800__JPA_Query_new_Object.htm也许我不清楚)
答案 0 :(得分:0)
您可以使用以下方法进行同样的操作。
只需在实体类中使用所有必需的参数创建一个构造函数,然后在jpa查询中使用 new运算符进行查询,如下所示。
String query = "SELECT NEW com.dt.es.CustomObject(p.uniquePID) FROM PatientRegistration AS p";
TypedQuery<CustomObject> typedQuery = entityManager().createQuery(query , CustomObject.class);
List<CustomObject> results = typedQuery.getResultList();
return results;
CustomObject
类应与构造函数类似,如下所示。
public class CustomObject {
private String uniquePID;
public CustomObject(String uniquePID) {
super();
this.uniquePID = uniquePID;
}
public String getUniquePID() {
return uniquePID;
}
public void setUniquePID(String uniquePID) {
this.uniquePID = uniquePID;
}
}
答案 1 :(得分:0)
spring-data-jpa projection不需要映射整个表,只需选择必要的文件即可:
mysvc.exe
通过这种方式,CatDto是一个接口,它仅包含整个表的某些字段。其字段名称必须与选择字段的别名匹配。