Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA&;标准API-仅选择特定列_Java_Hibernate_Jpa_Criteria Api - Fatal编程技术网

Java JPA&;标准API-仅选择特定列

Java JPA&;标准API-仅选择特定列,java,hibernate,jpa,criteria-api,Java,Hibernate,Jpa,Criteria Api,我只想选择特定的列(例如,从b中选择a)。我有一个通用DAO,我想到的是: public List<T> getAll(boolean idAndVersionOnly) { CriteriaBuilder builder = manager.getCriteriaBuilder(); CriteriaQuery<T> criteria = builder.createQuery(entityClazz); Root<T> root =

我只想选择特定的列(例如,
从b中选择a
)。我有一个通用DAO,我想到的是:

public List<T> getAll(boolean idAndVersionOnly) {
    CriteriaBuilder builder = manager.getCriteriaBuilder();
    CriteriaQuery<T> criteria = builder.createQuery(entityClazz);
    Root<T> root = criteria.from(entityClazz);
    if (idAndVersionOnly) {
        criteria.select(root.get("ID").get("VERSION")); // HERE IS ERROR
    } else {
        criteria.select(root);
    }
    return manager.createQuery(criteria).getResultList();
}
public List getAll(仅布尔idAndVersionOnly){
CriteriaBuilder=manager.getCriteriaBuilder();
CriteriaQuery criteria=builder.createQuery(entityClazz);
根根=标准。从(EntityLazz);
如果(仅限于IDandVersion){
criteria.select(root.get(“ID”).get(“VERSION”);//这里是错误
}否则{
条件。选择(根);
}
return manager.createQuery(criteria.getResultList();
}
错误是:
themethodselect(Selection首先,我真的不明白为什么你想要一个只有ID和Version的对象,而所有其他道具都是空的(它不使用JPA Em,而是使用普通的Hibernate。我假设您可以在JPA中找到等价物,或者只需从Em委托获得Hibernate会话obj
):

List results=session.createCriteria(entityClazz)
.setProjection(Projections.projectionList()项目)
.add(Property.forName(“ID”))
.add(Property.forName(“版本”))
)
.setResultTransformer(变压器别名Bean(entityClazz));
.list();

这将返回一个ID和版本设置为空的对象列表以及所有其他道具,因为aliasToBean transformer将无法找到它们。同样,我不确定我是否能想到这样做的情况。

仅获取特定列的JPA方法之一是请求一个对象

在您的情况下,您需要这样写:

CriteriaQuery<Tuple> cq = builder.createTupleQuery();
// write the Root, Path elements as usual
Root<EntityClazz> root = cq.from(EntityClazz.class);
cq.multiselect(root.get(EntityClazz_.ID), root.get(EntityClazz_.VERSION));  //using metamodel
List<Tuple> tupleResult = em.createQuery(cq).getResultList();
for (Tuple t : tupleResult) {
    Long id = (Long) t.get(0);
    Long version = (Long) t.get(1);
}
然后您可以直接在
CriteriaQuery
构造函数中使用
T

CriteriaQuery<T> cq = builder.createQuery(T.class);
// write the Root, Path elements as usual
Root<EntityClazz> root = cq.from(EntityClazz.class);
cq.multiselect(root.get(EntityClazz_.ID), root.get(EntityClazz_.VERSION));  //using metamodel
List<T> result = em.createQuery(cq).getResultList();
CriteriaQuery cq=builder.createQuery(T.class);
//像往常一样编写根、路径元素
Root Root=cq.from(EntityClazz.class);
cq.multiselect(root.get(EntityClazz.ID),root.get(EntityClazz.VERSION));//使用元模型
List result=em.createQuery(cq.getResultList();
更多参考请参见此

cq.select(cb.construct(entityClazz.class, root.get("ID"), root.get("VERSION")));  // HERE IS NO ERROR

你可以这样做

Session session = app.factory.openSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery query = builder.createQuery();
Root<Users> root = query.from(Users.class);
query.select(root.get("firstname"));
String name = session.createQuery(query).getSingleResult();
Session Session=app.factory.openSession();
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery=builder.createQuery();
Root=query.from(Users.class);
query.select(root.get(“firstname”);
字符串名称=session.createQuery(query.getSingleResult();

您可以将“firstname”更改为所需列的名称。

谢谢。我想在我的Web服务中使用它。客户端请求“某物”列表只包含ID和版本。然后他将其与缓存进行比较,并请求更改的完整对象。听起来合理吗?这是为了节省网络带宽吗?我认为这取决于数据,但如果您希望数据经常更改,那么由于创建两个请求的tcp/ip开销,您可能会浪费更多的带宽,而不仅仅是从发送中进行保存g‘空心’副本。也许值得一看?是的,我知道。我只会将其用于不会经常更改的数据。我在JPA 2中找不到任何类似的内容:/
cq.select(cb.construct(entityClazz.class, root.get("ID"), root.get("VERSION")));  // HERE IS NO ERROR
Session session = app.factory.openSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery query = builder.createQuery();
Root<Users> root = query.from(Users.class);
query.select(root.get("firstname"));
String name = session.createQuery(query).getSingleResult();