發表於 程式分享

java hibernate 套件join table與sql command結果竟不相同

於java hibernate執行以下指令於t4 join結果非如預期,
理論上SELECT結果t1.date1會與t4.date1,
但結果卻不同,用command執行卻又相同~

SELECT t1.*, t2.*, t3.*, t4.*
  FROM table1 t1 
  LEFT JOIN table2 t2 
    ON t1.col1 = t2.col1 
  LEFT JOIN table3 t3 
    ON t2.col2 = t3.col2 
  LEFT JOIN table4 t4 
    ON t1.date1 = t4.date1 

Deubg許久後,想到之前有遇過SELECT t1.col1, t2.col1,
其2個值應不同,但t2.col1卻變成t1.col1之值,
因此將上述指令改成如下就OK了~

SELECT t1.*, t2.*, t3.*, t4.date1_t4
  FROM table1 t1 
  LEFT JOIN table2 t2 
    ON t1.col1 = t2.col1 
  LEFT JOIN table3 t3 
    ON t2.col2 = t3.col2 
  LEFT JOIN (SELECT date1 as date1_t4 FROM table4) t4 
    ON t1.date1 = t4.date1_t4
發表於 程式分享

java產生縮圖-為了清晰度

之前文章java產生縮圖
但清晰度不佳,又調整了一版,
清晰度變好,但檔案size也變大了~

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import com.sun.imageio.plugins.jpeg.JPEGImageWriter;
...

public void change2SmallImg_h(String fromImgPath, String destImgPath, String imgType, int maxHeight) {
        try {
            File fiBig = new File(fromImgPath);
            BufferedImage bis = ImageIO.read(fiBig);
            
            //原?的高?
            int w = bis.getWidth();
            int h = bis.getHeight();            
            //?放
            int nowHeight = maxHeight;
            int nowWidth = (nowHeight * w) / h;            
            changeImg(fiBig, destImgPath, imgType, nowWidth, nowHeight);
        } catch (Exception e) {
            e.printStackTrace();
        }
}
    
public void change2SmallImg_w(String fromImgPath, String destImgPath, String imgType, int maxWidth) {
        try {
            File fiBig = new File(fromImgPath);
            BufferedImage bis = ImageIO.read(fiBig);
            
            //原?的高?
            int w = bis.getWidth();
            int h = bis.getHeight();
            //?放
            int nowWidth = maxWidth;
            int nowHeight = (nowWidth * h) / w;
            changeImg(fiBig, destImgPath, imgType, nowWidth, nowHeight);
        } catch (Exception e) {
            e.printStackTrace();
        }
}
    
private boolean changeImg(File fiBig, String destImgPath, String imgType, int nowWidth, int nowHeight) {
    try {
        if (imgType.compareToIgnoreCase("png") == 0 || imgType.compareToIgnoreCase("gif") == 0){
                BufferedImage to= new BufferedImage(nowWidth, nowHeight, BufferedImage.TYPE_INT_RGB); 
                Graphics2D g2d = to.createGraphics(); 
                to = g2d.getDeviceConfiguration().createCompatibleImage(nowWidth, nowHeight, Transparency.TRANSLUCENT); 
                g2d.dispose(); 
                
                g2d = to.createGraphics(); 
                BufferedImage bis = ImageIO.read(fiBig);
                Image from = bis.getScaledInstance(nowWidth, nowHeight, Image.SCALE_AREA_AVERAGING); 
                g2d.drawImage(from, 0, 0, null);
                g2d.dispose(); 
                
                ImageIO.write(to, imgType, new File(destImgPath));
            } else {                
                BufferedImage tag = new BufferedImage(nowWidth, nowHeight, BufferedImage.TYPE_INT_RGB);
                Image img = ImageIO.read(fiBig);
                tag.getGraphics().drawImage(img.getScaledInstance(nowWidth, nowHeight, Image.SCALE_SMOOTH), 
                                            0, 0, null);
                /* only JDK 8.0,若JDK8以下,只能用下面這一段
                FileOutputStream out = new FileOutputStream(destImgPath);
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
                JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag);
                jep.setQuality(1f, true);
                encoder.encode(tag, jep);
                out.close();*/
                
                // Image writer
                JPEGImageWriter imageWriter = (JPEGImageWriter) ImageIO.getImageWritersBySuffix(imgType).next();
                FileOutputStream fos = new FileOutputStream(destImgPath);
                ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
                imageWriter.setOutput(ios);
             
                //and metadata
                IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(tag), null);

                int dpi = 96;   
                //new metadata
                Element tree = (Element) imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0");
                Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);
                for (int i = 0; i < jfif.getAttributes().getLength(); i++) {
                    Node attribute = jfif.getAttributes().item(i);
                    System.out.println(attribute.getNodeName() + "=" + attribute.getNodeValue());
                }
                jfif.setAttribute("Xdensity", Integer.toString(dpi));
                jfif.setAttribute("Ydensity", Integer.toString(dpi));
                imageMetaData.setFromTree("javax_imageio_jpeg_image_1.0", tree);

                // new Compression
                JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter.getDefaultWriteParam();
                jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
                jpegParams.setCompressionQuality(1.0f);
                
                //new Write and clean up
                imageWriter.write(imageMetaData, new IIOImage(tag, null, imageMetaData), jpegParams);
                ios.close();
                imageWriter.dispose();
            }
        return true;
    } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
}
發表於 程式分享

java-透過ldap登入公司AD Server

透過ldap登入公司AD Server ,我將程式包成函數

   public boolean LDAP_AUTH_AD(String ldap_url, String sLdapdc,String username, String password) {     
        Hashtable<String, String> env = new Hashtable<String,String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, ldap_url);
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, sLdapdc + "\\" + username);
        env.put(Context.SECURITY_CREDENTIALS, password);

        LdapContext ctx = null;
        try {
            ctx = new InitialLdapContext(env, null);
        } catch (javax.naming.AuthenticationException e) {
            this.setMessage("登入失敗- [員工編號] 或 [AD密碼] 輸入錯誤 !");
            logger.warn(username + ":登入失敗- [員工編號] 或 [AD密碼] 輸入錯誤 ! => " + e.getMessage());
            return false;
        } catch (javax.naming.CommunicationException e) {
            this.setMessage("登入失敗- 找不到認證主機 !");
            logger.error(username + ":登入失敗- 找入到認證主機 ! => " + e.getMessage());
            return false;
        } catch (Exception e) {         
            this.setMessage("登入失敗- 發生未知的錯誤,請洽系統管理員 !");
            logger.error(username + ":登入失敗- 發生未知的錯誤,請洽系統管理員 ! => " + e.getMessage());
            return false;
        } finally {
            if (ctx != null) {
                try {
                    ctx.close();
                } catch (NamingException e) {
                    logger.error(username + ":ctx.close()發生錯誤 ! => " + e.getMessage());
                } 
            }
        }   
        return true;
    }

ldap_url: 格式如ldap://localhost:389/
sLdapdc: 格式如cn=S. User, ou=NewHires, o=JNDITutorial
username: AD帳號
password: AD密碼