Hibernate与Mongodb的OGM根据同一表的第一个查询的Result字段,在同一个表上进行第二个查询的结果 [英] Hibernate OGM with Mongodb Result of 2nd Query on same table dependent on Result fields of 1st query of same table

查看:157
本文介绍了Hibernate与Mongodb的OGM根据同一表的第一个查询的Result字段,在同一个表上进行第二个查询的结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  @Entity 
使用Hibernate OGM(5.2.0.Alpha1)和Mongodb(3.4) @Table(name =service)
@JsonInclude(Include.NON_EMPTY)
public class Service {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY )
@Column(name =SERVICE_ID,unique = true,nullable = false)
@JsonSerialize(using = ToStringSerializer.class)
public ObjectId id;

私人字符串名称;

@ManyToOne
@JsonIgnore
public Lab lab;

getter ....
setter ....
}

@Entity
@Table(name =lab)
@JsonInclude(Include.NON_EMPTY)
// @JsonFilter(value = SalesUtils.MY_CUSTOM_FILTER_FOR_LAB)
public class Lab {

@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
@JsonSerialize(using = ToStringSerializer.class)
@Column(name =LAB_ID,unique = true,nullable = false)
public ObjectId id;

私人字符串名称;

@OneToMany(mappedBy =lab)
public List< Service> listOfServices;

getter ....
setter ....
}

Dao层:

  public< T>列表与LT; T> executeQuery(String query,Integer startPosition,Integer noOfRecords,T t){
List< T> listOfT = new ArrayList<>();

if(SalesUtils.isObjectisNullOrEmpty(startPosition,noOfRecords)){
listOfT = entityManager.createNativeQuery(query.toString(),t.getClass())。getResultList();
} else {
listOfT = entityManager.createNativeQuery(query.toString(),t.getClass())。setFirstResult(startPosition)
.setMaxResults(noOfRecords).getResultList();
}
返回SalesUtils.isListIsNullOrEmpty(listOfT)?新的ArrayList<>():listOfT;

服务层:(问题:实验室名称:null)

  @Transaction 
public void executeQuery(){

String query =db.service.find({ },{name:1});
列表<服务> listOfServices = myDao.executeQuery(query,null,null,new Service());

String anotherQuery ={$ query:{name:CDG Service}};
列表<服务> listOfAnotherServices = myDao.executeQuery(query,null,null,new Service()); $!
$ b if(!SalesUtils.isListIsNullOrEmpty(listOfAnotherServices)){
System.out.println(listOfAnotherServices.get(0).getName());
System.out.println(listOfAnotherServices.get(0).getLab()。getName()); (临时解决方案)


$ / code>

/ p>

  @Transaction 
public void executeQuery(){
//临时解决方案:在下面的第1行添加lab_LAB_ID字段查询
String query =db.service.find({},{name:1,lab_LAB_ID:1});
列表<服务> listOfServices = myDao.executeQuery(query,null,null,new Service());

String anotherQuery ={$ query:{name:CDG Service}};
列表<服务> listOfAnotherServices = myDao.executeQuery(query,null,null,new Service()); $!
$ b if(!SalesUtils.isListIsNullOrEmpty(listOfAnotherServices)){
System.out.println(listOfAnotherServices.get(0).getName());
System.out.println(listOfAnotherServices.get(0).getLab()。getName()); //非空
}
}

详细说明:


  1. 服务层:(问题:实验室名称:null)

在这里,我只使用第一个查询执行(变量名称=查询)获得服务表的'名称'字段,然后执行第二个查询(变量名称=另一个查询),但无法获得实验室对象。


  1. 服务层:(临时解决方案)

我使用第一个查询执行(变量名称=查询)得到'name'和'lab_LAB_ID'这两个字段,然后我执行第二个查询(变量名称=另一个查询),所以我不能成功地获得实验室对象。



我不明白这一点。
好​​像第二个查询结果依赖于第一个查询结果字段,即使查询不同并且变量名称也不同。



我是对吗? / p>使用本机查询,如果选择在根类上应用投影,则必须将其移除到实体,因为部分实体提取不应该被允许。
在产品的下一个版本中可能会引入异常抛出来防止这种使用。
这也是H2方言中Hibernate ORM(5.2 | 5.3)的当前行为。


I am using Hibernate OGM (5.2.0.Alpha1) with Mongodb (3.4)

@Entity
@Table(name = "service")
@JsonInclude(Include.NON_EMPTY)
public class Service {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "SERVICE_ID", unique = true, nullable = false)
    @JsonSerialize(using = ToStringSerializer.class)
    public ObjectId id;

    private String name;

    @ManyToOne
    @JsonIgnore
    public Lab lab;

    getter....
    setter....
}

@Entity
@Table(name = "lab")
@JsonInclude(Include.NON_EMPTY)
// @JsonFilter(value=SalesUtils.MY_CUSTOM_FILTER_FOR_LAB)
public class Lab {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonSerialize(using = ToStringSerializer.class)
    @Column(name = "LAB_ID", unique = true, nullable = false)
    public ObjectId id;

    private String name;

    @OneToMany(mappedBy = "lab")
    public List<Service> listOfServices;

    getter....
    setter....
}

Dao Layer:

public <T> List<T> executeQuery(String query, Integer startPosition, Integer noOfRecords, T t) {
        List<T> listOfT = new ArrayList<>();

        if (SalesUtils.isObjectisNullOrEmpty(startPosition, noOfRecords)) {
            listOfT = entityManager.createNativeQuery(query.toString(), t.getClass()).getResultList();
        } else {
            listOfT = entityManager.createNativeQuery(query.toString(), t.getClass()).setFirstResult(startPosition)
                    .setMaxResults(noOfRecords).getResultList();
        }
        return SalesUtils.isListIsNullOrEmpty(listOfT) ? new ArrayList<>() : listOfT;
    }

Service Layer : (Issue : Lab name : null)

@Transaction
public void executeQuery(){

    String query = "db.service.find({} , {"name":1})";
    List<Service> listOfServices = myDao.executeQuery(query , null , null ,new Service());

    String anotherQuery = " { $query : { name : "CDG Service"}}";
    List<Service> listOfAnotherServices = myDao.executeQuery(query , null , null ,new Service());

    if (!SalesUtils.isListIsNullOrEmpty(listOfAnotherServices )) {
        System.out.println(listOfAnotherServices.get(0).getName());
        System.out.println(listOfAnotherServices.get(0).getLab().getName()); //null 
    }
}

Service Layer : (Temporary Solution)

 @Transaction
    public void executeQuery(){
        //Temporary solution : added lab_LAB_ID field in below 1st query
        String query = "db.service.find({} , {"name":1,"lab_LAB_ID":1})";
        List<Service> listOfServices = myDao.executeQuery(query , null , null ,new Service());

        String anotherQuery = " { $query : { name : "CDG Service"}}";
        List<Service> listOfAnotherServices = myDao.executeQuery(query , null , null ,new Service());

        if (!SalesUtils.isListIsNullOrEmpty(listOfAnotherServices )) {
            System.out.println(listOfAnotherServices.get(0).getName());
            System.out.println(listOfAnotherServices.get(0).getLab().getName()); //not null
        }
    }

Detail Explanation :

  1. Service Layer : (Issue : Lab name : null)

Here i only get 'name' field of service table using 1st query execution (variable name = query) and then executed 2nd query(variable name = anotherQuery) , but can not get lab object.

  1. Service Layer : (Temporary Solution)

so i get 'name' and 'lab_LAB_ID' both fields using 1st query execution (variable name = query) and then i executed 2nd query(variable name = anotherQuery) so not i can successfully get lab object.

I don't understand this. It seems like 2nd query result is dependent on 1st query result fields even if query is different and variable name is also different.

Is I am right?

解决方案

Using native queries, if you choose to apply a projection on the root class you have to remove toEntity, because partial a entity extraction should not be allowed. It is likely that an exception throwing will be introduced in the next versions of the product to prevent this use. This is the current behaviour of Hibernate ORM (5.2 | 5.3) on H2 dialect too.

这篇关于Hibernate与Mongodb的OGM根据同一表的第一个查询的Result字段,在同一个表上进行第二个查询的结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆