Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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 Hibernate运行不需要的update语句_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java Hibernate运行不需要的update语句

Java Hibernate运行不需要的update语句,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我有本机查询要运行: String sqlSelect = "select r.id_roster as id, " + "count(roster_cat.id_category), " + " sum(case when roster_cat.id_category IN ( :categoryIds) then 1 else 0 end) as counter " +

我有本机查询要运行:

String sqlSelect =
"select r.id_roster as id, " +
                    "count(roster_cat.id_category), " +
            "       sum(case when roster_cat.id_category IN ( :categoryIds)                       then 1 else 0 end) as counter " +
            "from roster r " +
            "inner join roster_sa_categories roster_cat " +
                "on r.id_roster = roster_cat.id_roster " +
            "where r.day = :dayToLookFor " +
                "and r.id_shop = :idShop " +
            "group by r.id_roster " +
            "having count(roster_cat.id_category) = :nrCategories " +
                "and count(roster_cat.id_category) = counter" ;

    Query selectRostersQuery = entityManager.createNativeQuery(sqlSelect);

    selectRostersQuery.setParameter("categoryIds", Arrays.asList(categoryIds));
    selectRostersQuery.setParameter("dayToLookFor", day.toString());
    selectRostersQuery.setParameter("idShop", shopId);
    selectRostersQuery.setParameter("nrCategories", categoryIds.length);

    List<Integer> rosterIds =  new ArrayList<>();

    List<Object> result = (List<Object>) selectRostersQuery.getResultList();

任何帮助都将不胜感激,谢谢

您所描述的正是Hibernate的
FlushMode.AUTO所暗示的

执行查询时持久性上下文(1LC)中的任何修改都将在执行查询之前自动刷新,从而确保数据库返回的结果与内存中修改缓存的结果相匹配

如果查询将返回看到更新的实体,那么您可能应该重新评估您的操作,确保在更新之前触发查询以避免刷新操作,这可能会非常昂贵,具体取决于持久性上下文中实体的数量

如果绝对确信所看到的刷新更改不会由相关查询返回,则始终可以通过手动设置刷新模式强制查询不导致刷新:

Query query = session.createQuery( ... );
query.setFlushMode( FlushMode.COMMIT );
List results = query.list();

但是,只有当您确信查询不会读取未提交的更改时,才能执行此操作,因为这可能会导致许多问题,并导致长时间的调试会话,以了解应用程序意外丢失更改的原因。

我倾向于猜测Hibrate缓存了一些相关的实体修改,它需要将它们刷新到数据库中,以确保查询返回正确的结果。目前还不清楚这将如何或为什么会“干扰[你的]数据”。那么我能对此做些什么呢?因为我真的需要使用这个查询,关键是Hibernate几乎肯定是在做它所做的事情,因为你自己的代码做的其他事情,而Hibernate在这种情况下可能是在做正确的事情。关于可能发生的事情,我给了你我最好的猜测,但你真的没有给我们太多的合作机会。一般来说,我们想要一个。同意约翰。。。您以前可能选择了一个
花名册
对象,并以某种方式对其进行了修改。如果您确信会话中不需要任何附加实体,您可以运行
session.clear()
,但在处理这些内容时要非常小心。
Query query = session.createQuery( ... );
query.setFlushMode( FlushMode.COMMIT );
List results = query.list();