While I do agree wholeheartedly with most of what you say, I do think it's unfair to say that the requirement is "fundamentally broken". That label should be reserved for SQL itself ;-)
If there is some opaque business rule R that operates on a large set of input data, and that rule is implemented in Java, using Hibernate to get the input data, it's quite possible that the rule generates a large list of entities to retrieve. Is there a better way to batch fetch a s***load of specific entities, given a List or Set of identifiers? Here's another scenario. Suppose I have "master" table, suppose "orders". And another table "order_line_items",which is a one-to-many, and another table "order_state_change" which is also one-to-many. And suppose also that there is a somewhat complex (computationally or I/O cost) set of conditions to filter the retrieved results. There is a huge Inefficiency with multiple one-to-many joins (and no global temp table) because you have to either: 1) execute the complex where clause once for each one-to-many 2) build in your temp segment then fetch across your network a Cartesian product of the one-to-manys 3) use an "in (id1, id2, id3...)" clause for each one-to-many However, I agree that in reality, any of #1, #2 or #3 are unfortunately MORE desirable than my global temp table solution because of the massive headache in managing such a solution. But I DO think it's actually easier on the temp segment than to not use it, in most cases. David On 12/03/2011 05:23 AM, Max Rydahl Andersen wrote: >> One technical (and probably way out of scope!) way to handle this would >> be to use a temp table, do a batch insert of the values, then change the >> " in (v1, v2, v3...)" to " in (select v from temp)". > I think I would rather hear people complain about query exceptions happening > when > they are doing something fundamentally broken with a database than seeing > them realize their test > queries working as expected and then when they go to production with enough > data to pass the 1000 elements limit > their read only queries suddenly are trashing the temp table space and their > user need to be able to have create table permissions. > > /max > > > >> >> >> On 12/01/2011 04:20 AM, Emmanuel Bernard wrote: >>> Ah good point, I haven't thought of that problem with query splitting >>> >>> On 30 nov. 2011, at 22:20, Steve Ebersole wrote: >>> >>>> Splitting is not always an option. Consider a predicate like: >>>> >>>> ... where a in (x1, ... x2000) and b in (y1, ... y2000) ... >>>> >>>> If you split this up, you will have misses. Yes, it works if you can keep >>>> it all in one query because you can structure it to maintain the original >>>> semantics. However, please read the comments on that JIRA issue. For >>>> some databases, this restriction is not just on the number of elements in >>>> a in-list, but on the number of parameters overall. Splitting these 2 >>>> in-lists about into 4 does not address that. >>>> >>>> I commented on the issue that I am actually inclined to simply reject this >>>> one. In fact, I thought we already did. Maybe that was another earlier >>>> one? >>>> >>>> >>>> On Wed 30 Nov 2011 04:45:55 AM CST, Emmanuel Bernard wrote: >>>>> Also note that there is a limit for the query size globally in some >>>>> vendors and that people relieved from HHH-1123 cal fall into the second >>>>> limit. >>>>> A solution would be for Hibernate to split one query into several but I'm >>>>> not sure I like the idea. >>>>> >>>>> Emmanuel >>>>> >>>>> On 29 nov. 2011, at 21:29, Łukasz Antoniak wrote: >>>>> >>>>>> Hi all! >>>>>> >>>>>> Recently I had a closer look at HHH-1123 issue. This bug affects both - >>>>>> Criteria API and HQL. I have introduced >>>>>> Dialect#maximumInExpressionElements() method which returns maximum >>>>>> number of allowed elements in a single SQL IN clause, or null treated as >>>>>> infinite. The change of InExpression was very easy. However, fixing this >>>>>> bug for HQL queries requires modification of ParameterMetadata >>>>>> (namedDescriptorMap cannot remain unmodifiable), as well as >>>>>> AbstractQueryImpl (queryString). As I don't see any other solution, I >>>>>> wanted to ask you guys for suggestions. Is it the only possible way of >>>>>> fixing this issue? Finally, shall we really fix this? This is a DB >>>>>> vendor limitation, but 40 user gave their vote for it. >>>>>> >>>>>> Regards, >>>>>> Lukasz Antoniak >>>>>> _______________________________________________ >>>>>> hibernate-dev mailing list >>>>>> hibernate-dev@lists.jboss.org >>>>>> https://lists.jboss.org/mailman/listinfo/hibernate-dev >>>>> _______________________________________________ >>>>> hibernate-dev mailing list >>>>> hibernate-dev@lists.jboss.org >>>>> https://lists.jboss.org/mailman/listinfo/hibernate-dev >>>> -- >>>> st...@hibernate.org >>>> http://hibernate.org >>> _______________________________________________ >>> hibernate-dev mailing list >>> hibernate-dev@lists.jboss.org >>> https://lists.jboss.org/mailman/listinfo/hibernate-dev >> _______________________________________________ >> hibernate-dev mailing list >> hibernate-dev@lists.jboss.org >> https://lists.jboss.org/mailman/listinfo/hibernate-dev > /max > http://about.me/maxandersen > > > _______________________________________________ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev