|
25 | 25 | import java.util.Set;
|
26 | 26 | import java.util.Spliterator;
|
27 | 27 | import java.util.Spliterators;
|
| 28 | +import java.util.function.BiConsumer; |
| 29 | +import java.util.function.BiFunction; |
| 30 | +import java.util.function.Consumer; |
| 31 | +import java.util.function.Function; |
| 32 | +import java.util.function.Supplier; |
28 | 33 | import java.util.stream.Stream;
|
29 | 34 | import java.util.stream.StreamSupport;
|
30 | 35 | import javax.persistence.CacheRetrieveMode;
|
@@ -752,57 +757,104 @@ public boolean isBound(Parameter<?> parameter) {
|
752 | 757 | @Override
|
753 | 758 | public <T> T getParameterValue(Parameter<T> parameter) {
|
754 | 759 | LOGGER.tracef( "#getParameterValue(%s)", parameter );
|
755 |
| - |
756 | 760 | getProducer().checkOpen( false );
|
757 | 761 |
|
758 |
| - if ( !getParameterMetadata().containsReference( (QueryParameter) parameter ) ) { |
759 |
| - throw new IllegalArgumentException( "Parameter reference [" + parameter + "] did not come from this query" ); |
760 |
| - } |
761 |
| - |
762 |
| - final QueryParameterBinding<T> binding = getQueryParameterBindings().getBinding( (QueryParameter<T>) parameter ); |
763 |
| - LOGGER.debugf( "Checking whether parameter reference [%s] is bound : %s", parameter, binding.isBound() ); |
764 |
| - if ( !binding.isBound() ) { |
765 |
| - throw new IllegalStateException( "Parameter value not yet bound : " + parameter.toString() ); |
766 |
| - } |
767 |
| - return binding.getBindValue(); |
| 762 | + return (T) getParameterValue( |
| 763 | + (QueryParameter) parameter, |
| 764 | + (queryParameter) -> new IllegalStateException( "Parameter value not yet bound : " + queryParameter.toString() ), |
| 765 | + (queryParameter, e) -> { |
| 766 | + final String message = "Parameter reference [" + queryParameter + "] did not come from this query"; |
| 767 | + if ( e == null ) { |
| 768 | + return new IllegalArgumentException( message ); |
| 769 | + } |
| 770 | + return new IllegalArgumentException( message, e ); |
| 771 | + }, |
| 772 | + (queryParameter, isBound) -> LOGGER.debugf( |
| 773 | + "Checking whether parameter reference [%s] is bound : %s", |
| 774 | + queryParameter, |
| 775 | + isBound |
| 776 | + ) |
| 777 | + ); |
768 | 778 | }
|
769 | 779 |
|
770 | 780 | @Override
|
771 | 781 | public Object getParameterValue(String name) {
|
772 | 782 | getProducer().checkOpen( false );
|
773 | 783 |
|
774 |
| - final QueryParameterBinding binding; |
775 |
| - try { |
776 |
| - binding = getQueryParameterBindings().getBinding( name ); |
777 |
| - } |
778 |
| - catch (QueryParameterException e) { |
779 |
| - throw new IllegalArgumentException( "Could not resolve parameter by name - " + name, e ); |
780 |
| - } |
781 |
| - |
782 |
| - LOGGER.debugf( "Checking whether named parameter [%s] is bound : %s", name, binding.isBound() ); |
783 |
| - if ( !binding.isBound() ) { |
784 |
| - throw new IllegalStateException( "Parameter value not yet bound : " + name ); |
785 |
| - } |
786 |
| - return binding.getBindValue(); |
| 784 | + final QueryParameter<Object> queryParameter = getParameterMetadata().getQueryParameter( name ); |
| 785 | + return getParameterValue( |
| 786 | + queryParameter, |
| 787 | + (parameter) -> new IllegalStateException( "Parameter value not yet bound : " + parameter.getName() ), |
| 788 | + (parameter, e) -> { |
| 789 | + final String message = "Could not resolve parameter by name - " + parameter.getName(); |
| 790 | + if ( e == null ) { |
| 791 | + return new IllegalArgumentException( message ); |
| 792 | + } |
| 793 | + return new IllegalArgumentException( message, e ); |
| 794 | + }, |
| 795 | + (parameter, isBound) -> LOGGER.debugf( |
| 796 | + "Checking whether positional named [%s] is bound : %s", |
| 797 | + parameter.getName(), |
| 798 | + isBound |
| 799 | + ) |
| 800 | + ); |
787 | 801 | }
|
788 | 802 |
|
789 | 803 | @Override
|
790 | 804 | public Object getParameterValue(int position) {
|
791 | 805 | getProducer().checkOpen( false );
|
792 | 806 |
|
793 |
| - final QueryParameterBinding binding; |
| 807 | + final QueryParameter<Object> queryParameter = getParameterMetadata().getQueryParameter( position ); |
| 808 | + return getParameterValue( |
| 809 | + queryParameter, |
| 810 | + (parameter) -> new IllegalStateException( "Parameter value not yet bound : " + parameter.getPosition() ), |
| 811 | + (parameter, e) -> { |
| 812 | + String message = "Could not resolve parameter by position - " + parameter.getPosition(); |
| 813 | + if ( e == null ) { |
| 814 | + return new IllegalArgumentException( message ); |
| 815 | + } |
| 816 | + return new IllegalArgumentException( message, e ); |
| 817 | + }, |
| 818 | + (parameter, isBound) -> LOGGER.debugf( |
| 819 | + "Checking whether positional parameter [%s] is bound : %s", |
| 820 | + parameter.getPosition(), |
| 821 | + isBound |
| 822 | + ) |
| 823 | + ); |
| 824 | + } |
| 825 | + |
| 826 | + private Object getParameterValue( |
| 827 | + QueryParameter queryParameter, |
| 828 | + Function<QueryParameter, IllegalStateException> notBoundParamenterException, |
| 829 | + BiFunction<QueryParameter, QueryParameterException, IllegalArgumentException> couldNotResolveParameterException, |
| 830 | + BiConsumer<QueryParameter, Boolean> boundCheckingLogger) { |
794 | 831 | try {
|
795 |
| - binding = getQueryParameterBindings().getBinding( position ); |
| 832 | + final QueryParameterBindings parameterBindings = getQueryParameterBindings(); |
| 833 | + |
| 834 | + if ( queryParameter == null ) { |
| 835 | + throw couldNotResolveParameterException.apply( queryParameter, null ); |
| 836 | + } |
| 837 | + if ( parameterBindings.isMultiValuedBinding( queryParameter ) ) { |
| 838 | + final QueryParameterListBinding<Object> queryParameterListBinding = parameterBindings |
| 839 | + .getQueryParameterListBinding( queryParameter ); |
| 840 | + final Collection<Object> bindValues = queryParameterListBinding.getBindValues(); |
| 841 | + if ( bindValues == null ) { |
| 842 | + throw notBoundParamenterException.apply( queryParameter ); |
| 843 | + } |
| 844 | + return bindValues; |
| 845 | + } |
| 846 | + |
| 847 | + final QueryParameterBinding<Object> binding = parameterBindings.getBinding( queryParameter ); |
| 848 | + final boolean bound = binding.isBound(); |
| 849 | + boundCheckingLogger.accept( queryParameter, bound ); |
| 850 | + if ( !bound ) { |
| 851 | + throw notBoundParamenterException.apply( queryParameter ); |
| 852 | + } |
| 853 | + return binding.getBindValue(); |
796 | 854 | }
|
797 | 855 | catch (QueryParameterException e) {
|
798 |
| - throw new IllegalArgumentException( "Could not resolve parameter by position - " + position, e ); |
799 |
| - } |
800 |
| - |
801 |
| - LOGGER.debugf( "Checking whether positional parameter [%s] is bound : %s", (Integer) position, (Boolean) binding.isBound() ); |
802 |
| - if ( !binding.isBound() ) { |
803 |
| - throw new IllegalStateException( "Parameter value not yet bound : " + position ); |
| 856 | + throw couldNotResolveParameterException.apply( queryParameter, e ); |
804 | 857 | }
|
805 |
| - return binding.getBindValue(); |
806 | 858 | }
|
807 | 859 |
|
808 | 860 | @Override
|
|
0 commit comments