docs: @Override
  	public CPFriendlyURLEntry fetchByG_C_L_U(long groupId, long classNameId,
  		String languageId, String urlTitle, boolean retrieveFromCache) {
  		Object[] finderArgs = new Object[] {
  				groupId, classNameId, languageId, urlTitle
  			};
  
  		Object result = null;
  
  		if (retrieveFromCache) {
  			result = finderCache.getResult(FINDER_PATH_FETCH_BY_G_C_L_U,
  					finderArgs, this);
  		}
  
  		if (result instanceof CPFriendlyURLEntry) {
  			CPFriendlyURLEntry cpFriendlyURLEntry = (CPFriendlyURLEntry)result;
  
  			if ((groupId != cpFriendlyURLEntry.getGroupId()) ||
  					(classNameId != cpFriendlyURLEntry.getClassNameId()) ||
  					!Objects.equals(languageId,
  						cpFriendlyURLEntry.getLanguageId()) ||
  					!Objects.equals(urlTitle, cpFriendlyURLEntry.getUrlTitle())) {
  				result = null;
  			}
  		}
  
  		if (result == null) {
  			StringBundler query = new StringBundler(6);
  
  			query.append(_SQL_SELECT_CPFRIENDLYURLENTRY_WHERE);
  
  			query.append(_FINDER_COLUMN_G_C_L_U_GROUPID_2);
  
  			query.append(_FINDER_COLUMN_G_C_L_U_CLASSNAMEID_2);
  
  			boolean bindLanguageId = false;
  
  			if (languageId == null) {
  				query.append(_FINDER_COLUMN_G_C_L_U_LANGUAGEID_1);
  			}
  			else if (languageId.equals("")) {
  				query.append(_FINDER_COLUMN_G_C_L_U_LANGUAGEID_3);
  			}
  			else {
  				bindLanguageId = true;
  
  				query.append(_FINDER_COLUMN_G_C_L_U_LANGUAGEID_2);
  			}
  
  			boolean bindUrlTitle = false;
  
  			if (urlTitle == null) {
  				query.append(_FINDER_COLUMN_G_C_L_U_URLTITLE_1);
  			}
  			else if (urlTitle.equals("")) {
  				query.append(_FINDER_COLUMN_G_C_L_U_URLTITLE_3);
  			}
  			else {
  				bindUrlTitle = true;
  
  				query.append(_FINDER_COLUMN_G_C_L_U_URLTITLE_2);
  			}
  
  			String sql = query.toString();
  
  			Session session = null;
  
  			try {
  				session = openSession();
  
  				Query q = session.createQuery(sql);
  
  				QueryPos qPos = QueryPos.getInstance(q);
  
  				qPos.add(groupId);
  
  				qPos.add(classNameId);
  
  				if (bindLanguageId) {
  					qPos.add(languageId);
  				}
  
  				if (bindUrlTitle) {
  					qPos.add(urlTitle);
  				}
  
  				List<CPFriendlyURLEntry> list = q.list();
  
  				if (list.isEmpty()) {
  					finderCache.putResult(FINDER_PATH_FETCH_BY_G_C_L_U,
  						finderArgs, list);
  				}
  				else {
  					if (list.size() > 1) {
  						Collections.sort(list, Collections.reverseOrder());
  
  						if (_log.isWarnEnabled()) {
  							_log.warn(
  								"CPFriendlyURLEntryPersistenceImpl.fetchByG_C_L_U(long, long, String, String, boolean) with parameters (" +
  								StringUtil.merge(finderArgs) +
  								") yields a result set with more than 1 result. This violates the logical unique restriction. There is no order guarantee on which result is returned by this finder.");
  						}
  					}
  
  					CPFriendlyURLEntry cpFriendlyURLEntry = list.get(0);
  
  					result = cpFriendlyURLEntry;
  
  					cacheResult(cpFriendlyURLEntry);
  				}
  			}
  			catch (Exception e) {
  				finderCache.removeResult(FINDER_PATH_FETCH_BY_G_C_L_U,
  					finderArgs);
  
  				throw processException(e);
  			}
  			finally {
  				closeSession(session);
  			}
  		}
  
  		if (result instanceof List<?>) {
  			return null;
  		}
  		else {
  			return (CPFriendlyURLEntry)result;
  		}
  	}