Условие SQL, если не существует

Injection Dependency (DI) - это один из шаблонов проектирования, который использует основную функцию OOP - отношения в одном объекте с другим объектом. Хотя наследование наследует один объект для создания более сложного и конкретного другого объекта, отношения или ассоциации просто создают указатель на другой объект из одного объекта с использованием атрибута. Мощность DI сочетается с другими функциями ООП, как и интерфейсы и скрывающий код. Предположим, у нас есть клиент (подписчик) в библиотеке, который может занять только одну книгу для простоты.

Интерфейс книги:

package com.deepam.hidden;

public interface BookInterface {

public BookInterface setHeight(int height);
public BookInterface setPages(int pages);   
public int getHeight();
public int getPages();  

public String toString();
}

Далее у нас может быть много видов книги; один из типов - фикция:

package com.deepam.hidden;

public class FictionBook implements BookInterface {
int height = 0; // height in cm
int pages = 0; // number of pages

/** constructor */
public FictionBook() {
    // TODO Auto-generated constructor stub
}

@Override
public FictionBook setHeight(int height) {
  this.height = height;
  return this;
}

@Override
public FictionBook setPages(int pages) {
  this.pages = pages;
  return this;      
}

@Override
public int getHeight() {
    // TODO Auto-generated method stub
    return height;
}

@Override
public int getPages() {
    // TODO Auto-generated method stub
    return pages;
}

@Override
public String toString(){
    return ("height: " + height + ", " + "pages: " + pages);
}
}

Теперь абонент может иметь связь с книгой:

package com.deepam.hidden;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Subscriber {
BookInterface book;

/** constructor*/
public Subscriber() {
    // TODO Auto-generated constructor stub
}

// injection I
public void setBook(BookInterface book) {
    this.book = book;
}

// injection II
public BookInterface setBook(String bookName) {
    try {
        Class<?> cl = Class.forName(bookName);
        Constructor<?> constructor = cl.getConstructor(); // use it for parameters in constructor
        BookInterface book = (BookInterface) constructor.newInstance();
        //book = (BookInterface) Class.forName(bookName).newInstance();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
    return book;
}

public BookInterface getBook() {
  return book;
}

public static void main(String[] args) {

}

}

Все три класса могут быть скрыты для собственной реализации. Теперь мы можем использовать этот код для DI:

package com.deepam.implement;

import com.deepam.hidden.Subscriber;
import com.deepam.hidden.FictionBook;

public class CallHiddenImplBook {

public CallHiddenImplBook() {
    // TODO Auto-generated constructor stub
}

public void doIt() {
    Subscriber ab = new Subscriber();

    // injection I
    FictionBook bookI = new FictionBook();
    bookI.setHeight(30); // cm
    bookI.setPages(250);
    ab.setBook(bookI); // inject
    System.out.println("injection I " + ab.getBook().toString());

    // injection II
    FictionBook bookII = ((FictionBook) ab.setBook("com.deepam.hidden.FictionBook")).setHeight(5).setPages(108); // inject and set
    System.out.println("injection II " + ab.getBook().toString());      
}

public static void main(String[] args) {
    CallHiddenImplBook kh = new CallHiddenImplBook();
    kh.doIt();
}
}

Существует множество способов использования инъекции зависимостей. Можно объединить его с Singleton и т. Д., Но все же в базовом это только ассоциация, реализуемая путем создания атрибута типа объекта внутри другого объекта. Полезность только и только в функции, этот код, который мы должны писать снова и снова, всегда готов и сделан для нас вперед. Вот почему DI так тесно связан с Inversion of Control (IoC), что означает, что наша программа передает управляющий другой запущенный модуль, который делает инъекции компонентов в наш код. (Каждый объект, который можно вставить, может быть подписан или рассматриваться как Bean.) Например, весной это делается путем создания и инициализации контейнера ApplicationContext , что делает это для нас. Мы просто в нашем коде создаем контекст и вызываем инициализацию bean-компонентов. В этот момент инъекция была сделана автоматически.

0
задан t-clausen.dk 16 January 2019 в 18:29
поделиться

1 ответ

Я понимаю, что вы должны выбрать id из posts, чтобы:

  • либо имели соответствующую запись в cdlr_post_meta с [ 114] и meta_value <> 1

  • или не имеют записи cdlr_post_meta с meta_key = 'statusCDLR'

A Стратегия для достижения этой цели заключается в использовании LEFT JOIN для поиска записи в cdlr_post_meta с помощью meta_key = 'statusCDLR', а затем реализации остальной логики в предложении WHERE (если нет соответствующей записи, столбцы pm все NULL).

SELECT p.ID
FROM cdlr_posts p
LEFT JOIN cdlr_postmeta pm 
    ON pm.post_id = p.ID AND pm.meta_key = '_statusCDLR'
WHERE 
    p.post_type = 'shop_order'
    AND ( pm.post_id IS NULL OR pm.meta_value <> 1 )
GROUP BY p.ID

PS - Общие замечания относительно вашего sql:

  • При смешивании OR и AND с, вы должны заключать тестовые выражения в скобки, чтобы избежать в вопросы приоритета (AND имеет более высокий приоритет, чем OR).

  • Вы должны использовать явные JOIN вместо неявных.

0
ответ дан GMB 16 January 2019 в 18:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: