Oracle SQL客户端和应用程序执行相同本机查询时的不同结果集

Oracle SQL客户端和应用程序执行相同本机查询时的不同结果集,oracle,spring-4,jpa-2.1,Oracle,Spring 4,Jpa 2.1,全部。在对Oracle数据库执行本机SQL查询时,我遇到了一种奇怪的情况。在我的例子中,如果查询是通过SQL客户端软件执行的,那么DbVisualizer我有一个结果集;如果我的基于Spring的Java应用程序执行它,结果就不同了 select c.id , c.parentId , c.name , c.sequence , c.isSuppressed , c.isGoto

全部。在对Oracle数据库执行本机SQL查询时,我遇到了一种奇怪的情况。在我的例子中,如果查询是通过SQL客户端软件执行的,那么DbVisualizer我有一个结果集;如果我的基于Spring的Java应用程序执行它,结果就不同了

select      
    c.id      
    , c.parentId     
    , c.name      
    , c.sequence      
    , c.isSuppressed      
    , c.isGotoCategory      
    , c.hasChildren      
    , c.startDate      
    , c.endDate  
from (  
    select      
        category.category_id as id      
        , category.parent_category_id as parentId      
        , nvl(context.category_name, category.category_name) as name      
        , nvl(context.sequence_num, category.sequence) as sequence      
        , nvl(context.is_suppressed, 'N') as isSuppressed      
        , decode(category.syndicate_url, null, 'N', 'Y') as isGotoCategory      
        , decode(category.is_leaf, 1, 'N', 'Y') as hasChildren      
        , category.start_date as startDate      
        , category.end_date as endDate  
    from (      
        select          
            category.category_id          
            , category.parent_category_id          
            , category.category_name          
            , category.start_date          
            , category.end_date          
            , category.syndicate_url          
            , category.sequence          
            , connect_by_isleaf as is_leaf          
            , level as category_level      
        from          
            category      
        start with 
            category.category_id =  (     
                select          
                category_id      
            from          
                category      
            where          
                parent_category_id is null      
            start with          
                category_id = 3485          
                connect by prior parent_category_id = category_id  
        )           
            connect by category.parent_category_id = prior category.category_id and level <= (4 + 1)  
    ) category      
        inner join category_destination_channel channel on channel.category_id = category.category_id          
            and channel.publish_flag = 'Y'          
            and channel.destination_channel_id = 1      
        left join contextual_category context on context.category_id = category.category_id          
            and context.context_type = 'DESKTOP'  
    where       
        category.category_level <= 4       
        and category.start_date <= sysdate 
        and category.end_date >= sysdate   
) c  
where      
    c.isSuppressed <> 'Y' 
上面的查询就是有问题的查询。通过SQL客户端执行时,外部限制将应用c.isSuppressed“Y”,并过滤掉记录。当应用程序执行查询时,外部限制似乎根本没有被应用,并且我的结果集有不应该存在的记录

以前有人遇到过这种问题吗

我的应用程序是用Java7、Spring4.x、Oracle11和OJDBC驱动程序版本11.2.0.3构建的。应用服务器是JBOSS EAP 6.3,我的测试是用Jetty maven Jetty插件6.1.26制作的

我已经考虑了问题的一些可能原因——应用程序访问错误的数据库,使用@SqlResultSetMapping时出现异常问题——但通过一些测试排除了这些原因。不知道该考虑什么了。< /P>
感谢您的帮助。提前感谢。

您的客户是否有不同的国家语言支持NLS设置?例如,如果将日期存储为字符串,则NLS_DATE_格式可能会使隐式日期比较的工作方式有所不同。如果存在国际化问题,NLS_COMP和NLS_SORT也可能很重要。我会怀疑您的应用程序的解析以及可能的转义字符或截断查询文本的内容。您是否检查了应用程序生成的查询文本,以查看它是否正在尝试执行完整的查询?@JonHeller查询中没有数据比较,但我将检查设置。@Calvinteflek我调试了Hibernate代码,它似乎正在向数据库发送正确的查询。唯一的替换是将参数命名为问号。